Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorForrest L Norvell <forrest@npmjs.com>2015-05-28 23:22:32 +0300
committerForrest L Norvell <forrest@npmjs.com>2015-05-28 23:41:54 +0300
commit7333701b5d4f01673f37d64992c63c4e15864d6d (patch)
treed309f4cc9359b017cdf056efb17821e59af74621 /node_modules/request
parent8edbe210af41e8f248f5bb92c72de92f54fda3b1 (diff)
request@2.56.0
Diffstat (limited to 'node_modules/request')
-rw-r--r--node_modules/request/CHANGELOG.md45
-rw-r--r--node_modules/request/README.md39
-rwxr-xr-xnode_modules/request/index.js25
-rw-r--r--node_modules/request/lib/auth.js6
-rw-r--r--node_modules/request/lib/helpers.js2
-rw-r--r--node_modules/request/lib/multipart.js6
-rw-r--r--node_modules/request/lib/oauth.js45
-rw-r--r--node_modules/request/lib/querystring.js51
-rw-r--r--node_modules/request/lib/redirect.js31
-rw-r--r--node_modules/request/node_modules/aws-sign2/package.json23
-rw-r--r--node_modules/request/node_modules/bl/package.json26
-rw-r--r--node_modules/request/node_modules/caseless/package.json16
-rw-r--r--node_modules/request/node_modules/combined-stream/Readme.md9
-rw-r--r--node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore3
-rw-r--r--node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md13
-rw-r--r--node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js12
-rw-r--r--node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json49
-rw-r--r--node_modules/request/node_modules/combined-stream/package.json35
-rw-r--r--node_modules/request/node_modules/forever-agent/package.json36
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/async/.travis.yml2
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/async/README.md65
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/async/bower.json38
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/async/component.json21
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/form-data/node_modules/async/lib/async.js26
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/async/package.json67
-rwxr-xr-xnode_modules/request/node_modules/form-data/node_modules/async/support/sync-package-managers.js53
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/License19
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md132
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js188
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore2
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License19
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile7
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md154
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js99
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json42
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/common.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js)0
-rwxr-xr-xnode_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js (renamed from node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/run.js)0
-rw-r--r--node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json37
-rw-r--r--node_modules/request/node_modules/form-data/package.json41
-rw-r--r--node_modules/request/node_modules/har-validator/README.md23
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/bluebird/changelog.md13
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.js56
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.min.js8
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/async.js44
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/direct_resolve.js8
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/schedule.js2
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/bluebird/package.json16
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json32
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json32
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/get-stdin/package.json27
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json32
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json32
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/chalk/package.json32
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/commander/History.md17
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/commander/Readme.md37
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/commander/index.js86
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/package.json24
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/commander/package.json26
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js30
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json25
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js6
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json24
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json21
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json19
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json27
-rw-r--r--node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js63
-rw-r--r--node_modules/request/node_modules/har-validator/package.json50
-rw-r--r--node_modules/request/node_modules/har-validator/src/index.js2
-rw-r--r--node_modules/request/node_modules/har-validator/src/schemas/cacheEntry.json50
-rwxr-xr-xnode_modules/request/node_modules/hawk/node_modules/boom/README.md7
-rwxr-xr-xnode_modules/request/node_modules/hawk/node_modules/boom/lib/index.js8
-rw-r--r--node_modules/request/node_modules/hawk/node_modules/boom/package.json23
-rwxr-xr-xnode_modules/request/node_modules/hawk/node_modules/boom/test/index.js16
-rw-r--r--node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json27
-rwxr-xr-xnode_modules/request/node_modules/hawk/node_modules/hoek/README.md33
-rwxr-xr-xnode_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js58
-rw-r--r--node_modules/request/node_modules/hawk/node_modules/hoek/package.json33
-rwxr-xr-xnode_modules/request/node_modules/hawk/node_modules/hoek/test/index.js1610
-rw-r--r--node_modules/request/node_modules/hawk/node_modules/sntp/package.json27
-rw-r--r--node_modules/request/node_modules/hawk/package.json27
-rw-r--r--node_modules/request/node_modules/http-signature/lib/index.js5
-rw-r--r--node_modules/request/node_modules/http-signature/lib/util.js16
-rw-r--r--node_modules/request/node_modules/http-signature/lib/verify.js52
-rw-r--r--node_modules/request/node_modules/http-signature/node_modules/asn1/package.json25
-rw-r--r--node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json25
-rw-r--r--node_modules/request/node_modules/http-signature/node_modules/ctype/package.json23
-rw-r--r--node_modules/request/node_modules/http-signature/package.json21
-rw-r--r--node_modules/request/node_modules/isstream/package.json26
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/.npmignore1
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md14
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/LICENSE36
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/Makefile35
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/README.md3
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/package.json62
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/stringify.js54
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/test.js128
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/test/mocha.opts2
-rw-r--r--node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js246
-rw-r--r--node_modules/request/node_modules/mime-types/HISTORY.md12
-rw-r--r--node_modules/request/node_modules/mime-types/README.md10
-rw-r--r--node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md21
-rw-r--r--node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md10
-rw-r--r--node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json30
-rw-r--r--node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json33
-rw-r--r--node_modules/request/node_modules/mime-types/package.json21
-rw-r--r--node_modules/request/node_modules/node-uuid/package.json5
-rw-r--r--node_modules/request/node_modules/oauth-sign/index.js3
-rw-r--r--node_modules/request/node_modules/oauth-sign/package.json32
-rw-r--r--node_modules/request/node_modules/oauth-sign/test.js15
-rw-r--r--node_modules/request/node_modules/qs/.eslintignore1
-rw-r--r--node_modules/request/node_modules/qs/.npmignore1
-rw-r--r--node_modules/request/node_modules/qs/CHANGELOG.md34
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/LICENSE0
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/Readme.md74
-rw-r--r--node_modules/request/node_modules/qs/bower.json22
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/lib/index.js0
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/lib/parse.js43
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/lib/stringify.js42
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/lib/utils.js66
-rw-r--r--node_modules/request/node_modules/qs/package.json37
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/test/parse.js238
-rw-r--r--[-rwxr-xr-x]node_modules/request/node_modules/qs/test/stringify.js58
-rw-r--r--node_modules/request/node_modules/qs/test/utils.js28
-rw-r--r--node_modules/request/node_modules/stringstream/package.json22
-rw-r--r--node_modules/request/node_modules/tough-cookie/.editorconfig12
-rw-r--r--node_modules/request/node_modules/tough-cookie/.npmignore1
-rw-r--r--node_modules/request/node_modules/tough-cookie/.travis.yml3
-rw-r--r--node_modules/request/node_modules/tough-cookie/LICENSE48
-rw-r--r--node_modules/request/node_modules/tough-cookie/README.md86
-rw-r--r--node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js174
-rw-r--r--node_modules/request/node_modules/tough-cookie/lib/cookie.js345
-rw-r--r--node_modules/request/node_modules/tough-cookie/lib/memstore.js71
-rw-r--r--node_modules/request/node_modules/tough-cookie/lib/pathMatch.js61
-rw-r--r--node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js56
-rw-r--r--node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js75
-rw-r--r--node_modules/request/node_modules/tough-cookie/lib/store.js30
-rw-r--r--node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt20
-rw-r--r--node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md176
-rw-r--r--node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json80
-rw-r--r--node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js530
-rw-r--r--node_modules/request/node_modules/tough-cookie/package.json45
-rw-r--r--node_modules/request/node_modules/tough-cookie/public-suffix.txt5874
-rw-r--r--node_modules/request/node_modules/tough-cookie/test.js1625
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/api_test.js372
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js468
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js90
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js164
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js162
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/date_test.js79
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js201
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json168
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json48
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json1959
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/ietf_test.js106
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/lifetime_test.js97
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/parsing_test.js294
-rw-r--r--node_modules/request/node_modules/tough-cookie/test/regression_test.js143
-rw-r--r--node_modules/request/node_modules/tunnel-agent/package.json26
-rw-r--r--node_modules/request/package.json38
-rw-r--r--node_modules/request/request.js139
168 files changed, 14225 insertions, 5490 deletions
diff --git a/node_modules/request/CHANGELOG.md b/node_modules/request/CHANGELOG.md
index 1c01d0875..7d861f171 100644
--- a/node_modules/request/CHANGELOG.md
+++ b/node_modules/request/CHANGELOG.md
@@ -1,5 +1,28 @@
## Change Log
+### 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)
@@ -21,7 +44,7 @@
- [#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, @BBB)
+- [#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, @nicolasmccurdy, @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 (@nicolasmccurdy)
@@ -69,7 +92,7 @@
- [#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)
+- [#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)
@@ -214,13 +237,13 @@
- [#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)
+- [#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)
+- [#996](https://github.com/request/request/pull/996) Wrong oauth signature when multiple same param keys exist [updated] (@bengl, @hyjin)
### v2.40.0 (2014/08/06)
- [#992](https://github.com/request/request/pull/992) Fix security vulnerability. Update qs (@poeticninja)
@@ -297,7 +320,7 @@
### v2.28.0 (2013/12/04)
- [#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. (@oztu)
+- [#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)
@@ -363,10 +386,10 @@
- [#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)
+- [#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)
-- [#413](https://github.com/request/request/pull/413) rename googledoodle.png to .jpg (@nfriedly)
+- [#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)
@@ -401,7 +424,7 @@
- [#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)
-- [#272](https://github.com/request/request/pull/272) Boundary begins with CRLF? (@elspoono)
+- [#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)
@@ -412,7 +435,7 @@
- [#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)
+- [#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)
@@ -456,7 +479,7 @@
- [#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)
+- [#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)
diff --git a/node_modules/request/README.md b/node_modules/request/README.md
index 2abc9e171..d8bd40570 100644
--- a/node_modules/request/README.md
+++ b/node_modules/request/README.md
@@ -5,6 +5,7 @@
[![Build status](https://img.shields.io/travis/request/request.svg?style=flat-square)](https://travis-ci.org/request/request)
[![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)
[![Gitter](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat-square)](https://gitter.im/request/request?utm_source=badge)
@@ -198,8 +199,7 @@ For advanced cases, you can access the form-data object itself via `r.form()`. T
```js
// NOTE: Advanced use-case, for normal use see 'formData' usage above
-var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) { // ...
-
+var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...})
var form = r.form();
form.append('my_field', 'my_value');
form.append('my_buffer', new Buffer([1, 2, 3]));
@@ -434,6 +434,10 @@ section of the oauth1 spec:
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)
@@ -579,7 +583,30 @@ Note: The `SOCKET` path is assumed to be absolute to the root of the host file s
## TLS/SSL Protocol
TLS/SSL Protocol options, such as `cert`, `key` and `passphrase`, can be
-set in the `agentOptions` property of the `options` object.
+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 recommendend 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
+var 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');
+
+var 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 requires client side SSL certificate
(in PEM format) with passphrase protected private key (in PEM format) and disable the SSLv3 protocol:
@@ -695,8 +722,8 @@ The first argument can be either a `url` or an `options` object. The only requir
---
- `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 or [querystring.parse](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) method
-- `qsStringifyOptions` - object containing options to pass to the [qs.stringify](https://github.com/hapijs/qs#stringifying) method or to the [querystring.stringify](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) method. For example, to change the way arrays are converted to query strings pass the `arrayFormat` option with one of `indices|brackets|repeat`
+- `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
@@ -733,6 +760,7 @@ The first argument can be either a `url` or an `options` object. The only requir
- `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`)
- `maxRedirects` - the maximum number of redirects to follow (default: `10`)
+- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`).
---
@@ -769,7 +797,6 @@ The first argument can be either a `url` or an `options` object. The only requir
tunneling proxy.
- `proxyHeaderExclusiveList` - A whitelist of headers to send
exclusively to a tunneling proxy and not to destination.
-- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`).
---
diff --git a/node_modules/request/index.js b/node_modules/request/index.js
index 347484080..5872824c8 100755
--- a/node_modules/request/index.js
+++ b/node_modules/request/index.js
@@ -56,16 +56,22 @@ function request (uri, options, callback) {
return new request.Request(params)
}
-var verbs = ['get', 'head', 'post', 'put', 'patch', 'del']
-
-verbs.forEach(function(verb) {
+function verbFunc (verb) {
var method = verb === 'del' ? 'DELETE' : verb.toUpperCase()
- request[verb] = function (uri, options, callback) {
+ 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.post = verbFunc('post')
+request.put = verbFunc('put')
+request.patch = verbFunc('patch')
+request.del = verbFunc('del')
request.jar = function (store) {
return cookies.jar(store)
@@ -75,7 +81,7 @@ request.cookie = function (str) {
return cookies.parse(str)
}
-function wrapRequestMethod (method, options, requester) {
+function wrapRequestMethod (method, options, requester, verb) {
return function (uri, opts, callback) {
var params = initParams(uri, opts, callback)
@@ -89,9 +95,8 @@ function wrapRequestMethod (method, options, requester) {
params.headers = extend(headers, params.headers)
}
- if (typeof method === 'string') {
- params.method = (method === 'del' ? 'DELETE' : method.toUpperCase())
- method = request[method]
+ if (verb) {
+ params.method = (verb === 'del' ? 'DELETE' : verb.toUpperCase())
}
if (isFunction(requester)) {
@@ -114,7 +119,7 @@ request.defaults = function (options, requester) {
var verbs = ['get', 'head', 'post', 'put', 'patch', 'del']
verbs.forEach(function(verb) {
- defaults[verb] = wrapRequestMethod(verb, options, requester)
+ defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb)
})
defaults.cookie = wrapRequestMethod(self.cookie, options, requester)
diff --git a/node_modules/request/lib/auth.js b/node_modules/request/lib/auth.js
index 13c3ac8f3..1be1f4258 100644
--- a/node_modules/request/lib/auth.js
+++ b/node_modules/request/lib/auth.js
@@ -21,7 +21,7 @@ function Auth (request) {
Auth.prototype.basic = function (user, pass, sendImmediately) {
var self = this
if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) {
- throw new Error('auth() received invalid user or password')
+ self.request.emit('error', new Error('auth() received invalid user or password'))
}
self.user = user
self.pass = pass
@@ -115,7 +115,7 @@ Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) {
var authHeader
if (bearer === undefined && user === undefined) {
- throw new Error('no auth mechanism defined')
+ self.request.emit('error', new Error('no auth mechanism defined'))
} else if (bearer !== undefined) {
authHeader = self.bearer(bearer, sendImmediately)
} else {
@@ -136,7 +136,7 @@ Auth.prototype.onResponse = function (response) {
var authHeader = c.get('www-authenticate')
var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()
- // debug('reauth', authVerb)
+ request.debug('reauth', authVerb)
switch (authVerb) {
case 'basic':
diff --git a/node_modules/request/lib/helpers.js b/node_modules/request/lib/helpers.js
index 8530d4013..1d588ca94 100644
--- a/node_modules/request/lib/helpers.js
+++ b/node_modules/request/lib/helpers.js
@@ -4,7 +4,7 @@ var jsonSafeStringify = require('json-stringify-safe')
, crypto = require('crypto')
function deferMethod() {
- if(typeof setImmediate === 'undefined') {
+ if (typeof setImmediate === 'undefined') {
return process.nextTick
}
diff --git a/node_modules/request/lib/multipart.js b/node_modules/request/lib/multipart.js
index 905a54b7f..03618588c 100644
--- a/node_modules/request/lib/multipart.js
+++ b/node_modules/request/lib/multipart.js
@@ -18,7 +18,7 @@ Multipart.prototype.isChunked = function (options) {
, parts = options.data || options
if (!parts.forEach) {
- throw new Error('Argument error, options.multipart.')
+ self.request.emit('error', new Error('Argument error, options.multipart.'))
}
if (options.chunked !== undefined) {
@@ -31,8 +31,8 @@ Multipart.prototype.isChunked = function (options) {
if (!chunked) {
parts.forEach(function (part) {
- if(typeof part.body === 'undefined') {
- throw new Error('Body attribute missing in multipart.')
+ if (typeof part.body === 'undefined') {
+ self.request.emit('error', new Error('Body attribute missing in multipart.'))
}
if (isstream(part.body)) {
chunked = true
diff --git a/node_modules/request/lib/oauth.js b/node_modules/request/lib/oauth.js
index fc1cac6d5..84059724a 100644
--- a/node_modules/request/lib/oauth.js
+++ b/node_modules/request/lib/oauth.js
@@ -4,10 +4,12 @@ var qs = require('qs')
, caseless = require('caseless')
, uuid = require('node-uuid')
, oauth = require('oauth-sign')
+ , crypto = require('crypto')
function OAuth (request) {
this.request = request
+ this.params = null
}
OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) {
@@ -57,6 +59,19 @@ OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib)
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 new Buffer(sha1).toString('base64')
+}
+
OAuth.prototype.concatParams = function (oa, sep, wrap) {
wrap = wrap || ''
@@ -76,13 +91,13 @@ OAuth.prototype.concatParams = function (oa, sep, wrap) {
OAuth.prototype.onRequest = function (_oauth) {
var self = this
- , request = self.request
+ self.params = _oauth
- var uri = request.uri || {}
- , method = request.method || ''
- , headers = caseless(request.headers)
- , body = request.body || ''
- , qsLib = request.qsLib || qs
+ var uri = self.request.uri || {}
+ , method = self.request.method || ''
+ , headers = caseless(self.request.headers)
+ , body = self.request.body || ''
+ , qsLib = self.request.qsLib || qs
var form
, query
@@ -98,27 +113,31 @@ OAuth.prototype.onRequest = function (_oauth) {
query = uri.query
}
if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) {
- throw new Error('oauth: transport_method of \'body\' requires \'POST\' ' +
- 'and content-type \'' + 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 = this.buildParams(_oauth, uri, method, query, form, qsLib)
+ var oa = self.buildParams(_oauth, uri, method, query, form, qsLib)
switch (transport) {
case 'header':
- request.setHeader('Authorization', 'OAuth ' + this.concatParams(oa, ',', '"'))
+ self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"'))
break
case 'query':
- request.path = (query ? '&' : '?') + this.concatParams(oa, '&')
+ self.request.path = (query ? '&' : '?') + self.concatParams(oa, '&')
break
case 'body':
- request.body = (form ? form + '&' : '') + this.concatParams(oa, '&')
+ self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&')
break
default:
- throw new Error('oauth: transport_method invalid')
+ self.request.emit('error', new Error('oauth: transport_method invalid'))
}
}
diff --git a/node_modules/request/lib/querystring.js b/node_modules/request/lib/querystring.js
new file mode 100644
index 000000000..baf5e8021
--- /dev/null
+++ b/node_modules/request/lib/querystring.js
@@ -0,0 +1,51 @@
+'use strict'
+
+var qs = require('qs')
+ , 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
index 7dd6c254c..1d4650299 100644
--- a/node_modules/request/lib/redirect.js
+++ b/node_modules/request/lib/redirect.js
@@ -15,27 +15,26 @@ function Redirect (request) {
this.removeRefererHeader = false
}
-Redirect.prototype.onRequest = function () {
+Redirect.prototype.onRequest = function (options) {
var self = this
- , request = self.request
- if (request.maxRedirects !== undefined) {
- self.maxRedirects = request.maxRedirects
+ if (options.maxRedirects !== undefined) {
+ self.maxRedirects = options.maxRedirects
}
- if (typeof request.followRedirect === 'function') {
- self.allowRedirect = request.followRedirect
+ if (typeof options.followRedirect === 'function') {
+ self.allowRedirect = options.followRedirect
}
- if (request.followRedirect !== undefined) {
- self.followRedirects = !!request.followRedirect
+ if (options.followRedirect !== undefined) {
+ self.followRedirects = !!options.followRedirect
}
- if (request.followAllRedirects !== undefined) {
- self.followAllRedirects = request.followAllRedirects
+ if (options.followAllRedirects !== undefined) {
+ self.followAllRedirects = options.followAllRedirects
}
if (self.followRedirects || self.followAllRedirects) {
self.redirects = self.redirects || []
}
- if (request.removeRefererHeader !== undefined) {
- self.removeRefererHeader = request.removeRefererHeader
+ if (options.removeRefererHeader !== undefined) {
+ self.removeRefererHeader = options.removeRefererHeader
}
}
@@ -46,7 +45,7 @@ Redirect.prototype.redirectTo = function (response) {
var redirectTo = null
if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) {
var location = response.caseless.get('location')
- // debug('redirect', location)
+ request.debug('redirect', location)
if (self.followAllRedirects) {
redirectTo = location
@@ -82,12 +81,12 @@ Redirect.prototype.onResponse = function (response) {
return false
}
-
- // debug('redirect to', redirectTo)
+ request.debug('redirect to', redirectTo)
// ignore any potential response body. it cannot possibly be useful
// to us at this point.
- if (request._paused) {
+ // response.resume should be defined, but check anyway before calling. Workaround for browserify.
+ if (response.resume) {
response.resume()
}
diff --git a/node_modules/request/node_modules/aws-sign2/package.json b/node_modules/request/node_modules/aws-sign2/package.json
index decba70fa..89adc7ded 100644
--- a/node_modules/request/node_modules/aws-sign2/package.json
+++ b/node_modules/request/node_modules/aws-sign2/package.json
@@ -8,7 +8,7 @@
"description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.",
"version": "0.5.0",
"repository": {
- "url": "https://github.com/mikeal/aws-sign"
+ "url": "git+https://github.com/mikeal/aws-sign.git"
},
"main": "index.js",
"dependencies": {},
@@ -22,24 +22,9 @@
"bugs": {
"url": "https://github.com/mikeal/aws-sign/issues"
},
+ "homepage": "https://github.com/mikeal/aws-sign#readme",
"_id": "aws-sign2@0.5.0",
- "dist": {
- "shasum": "c57103f7a17fc037f02d7c2e64b602ea223f7d63",
- "tarball": "http://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
- },
- "_from": "aws-sign2@>=0.5.0 <0.6.0",
- "_npmVersion": "1.3.2",
- "_npmUser": {
- "name": "mikeal",
- "email": "mikeal.rogers@gmail.com"
- },
- "maintainers": [
- {
- "name": "mikeal",
- "email": "mikeal.rogers@gmail.com"
- }
- ],
- "directories": {},
"_shasum": "c57103f7a17fc037f02d7c2e64b602ea223f7d63",
- "_resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
+ "_resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz",
+ "_from": "aws-sign2@>=0.5.0 <0.6.0"
}
diff --git a/node_modules/request/node_modules/bl/package.json b/node_modules/request/node_modules/bl/package.json
index 8571244fc..d6930087e 100644
--- a/node_modules/request/node_modules/bl/package.json
+++ b/node_modules/request/node_modules/bl/package.json
@@ -9,7 +9,7 @@
},
"repository": {
"type": "git",
- "url": "https://github.com/rvagg/bl.git"
+ "url": "git+https://github.com/rvagg/bl.git"
},
"homepage": "https://github.com/rvagg/bl",
"authors": [
@@ -33,29 +33,13 @@
"faucet": "~0.0.1",
"brtapsauce": "~0.3.0"
},
- "gitHead": "e7f90703c5f90ca26f60455ea6ad0b6be4a9feee",
+ "readme": "# bl *(BufferList)*\n\n**A Node.js Buffer list collector, reader and streamer thingy.**\n\n[![NPM](https://nodei.co/npm/bl.png?downloads=true&downloadRank=true)](https://nodei.co/npm/bl/)\n[![NPM](https://nodei.co/npm-dl/bl.png?months=6&height=3)](https://nodei.co/npm/bl/)\n\n**bl** is a storage object for collections of Node Buffers, exposing them with the main Buffer readable API. Also works as a duplex stream so you can collect buffers from a stream that emits them and emit buffers to a stream that consumes them!\n\nThe original buffers are kept intact and copies are only done as necessary. Any reads that require the use of a single original buffer will return a slice of that buffer only (which references the same memory as the original buffer). Reads that span buffers perform concatenation as required and return the results transparently.\n\n```js\nconst BufferList = require('bl')\n\nvar bl = new BufferList()\nbl.append(new Buffer('abcd'))\nbl.append(new Buffer('efg'))\nbl.append('hi') // bl will also accept & convert Strings\nbl.append(new Buffer('j'))\nbl.append(new Buffer([ 0x3, 0x4 ]))\n\nconsole.log(bl.length) // 12\n\nconsole.log(bl.slice(0, 10).toString('ascii')) // 'abcdefghij'\nconsole.log(bl.slice(3, 10).toString('ascii')) // 'defghij'\nconsole.log(bl.slice(3, 6).toString('ascii')) // 'def'\nconsole.log(bl.slice(3, 8).toString('ascii')) // 'defgh'\nconsole.log(bl.slice(5, 10).toString('ascii')) // 'fghij'\n\n// or just use toString!\nconsole.log(bl.toString()) // 'abcdefghij\\u0003\\u0004'\nconsole.log(bl.toString('ascii', 3, 8)) // 'defgh'\nconsole.log(bl.toString('ascii', 5, 10)) // 'fghij'\n\n// other standard Buffer readables\nconsole.log(bl.readUInt16BE(10)) // 0x0304\nconsole.log(bl.readUInt16LE(10)) // 0x0403\n```\n\nGive it a callback in the constructor and use it just like **[concat-stream](https://github.com/maxogden/node-concat-stream)**:\n\n```js\nconst bl = require('bl')\n , fs = require('fs')\n\nfs.createReadStream('README.md')\n .pipe(bl(function (err, data) { // note 'new' isn't strictly required\n // `data` is a complete Buffer object containing the full data\n console.log(data.toString())\n }))\n```\n\nNote that when you use the *callback* method like this, the resulting `data` parameter is a concatenation of all `Buffer` objects in the list. If you want to avoid the overhead of this concatenation (in cases of extreme performance consciousness), then avoid the *callback* method and just listen to `'end'` instead, like a standard Stream.\n\nOr to fetch a URL using [hyperquest](https://github.com/substack/hyperquest) (should work with [request](http://github.com/mikeal/request) and even plain Node http too!):\n```js\nconst hyperquest = require('hyperquest')\n , bl = require('bl')\n , url = 'https://raw.github.com/rvagg/bl/master/README.md'\n\nhyperquest(url).pipe(bl(function (err, data) {\n console.log(data.toString())\n}))\n```\n\nOr, use it as a readable stream to recompose a list of Buffers to an output source:\n\n```js\nconst BufferList = require('bl')\n , fs = require('fs')\n\nvar bl = new BufferList()\nbl.append(new Buffer('abcd'))\nbl.append(new Buffer('efg'))\nbl.append(new Buffer('hi'))\nbl.append(new Buffer('j'))\n\nbl.pipe(fs.createWriteStream('gibberish.txt'))\n```\n\n## API\n\n * <a href=\"#ctor\"><code><b>new BufferList([ callback ])</b></code></a>\n * <a href=\"#length\"><code>bl.<b>length</b></code></a>\n * <a href=\"#append\"><code>bl.<b>append(buffer)</b></code></a>\n * <a href=\"#get\"><code>bl.<b>get(index)</b></code></a>\n * <a href=\"#slice\"><code>bl.<b>slice([ start[, end ] ])</b></code></a>\n * <a href=\"#copy\"><code>bl.<b>copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])</b></code></a>\n * <a href=\"#duplicate\"><code>bl.<b>duplicate()</b></code></a>\n * <a href=\"#consume\"><code>bl.<b>consume(bytes)</b></code></a>\n * <a href=\"#toString\"><code>bl.<b>toString([encoding, [ start, [ end ]]])</b></code></a>\n * <a href=\"#readXX\"><code>bl.<b>readDoubleBE()</b></code>, <code>bl.<b>readDoubleLE()</b></code>, <code>bl.<b>readFloatBE()</b></code>, <code>bl.<b>readFloatLE()</b></code>, <code>bl.<b>readInt32BE()</b></code>, <code>bl.<b>readInt32LE()</b></code>, <code>bl.<b>readUInt32BE()</b></code>, <code>bl.<b>readUInt32LE()</b></code>, <code>bl.<b>readInt16BE()</b></code>, <code>bl.<b>readInt16LE()</b></code>, <code>bl.<b>readUInt16BE()</b></code>, <code>bl.<b>readUInt16LE()</b></code>, <code>bl.<b>readInt8()</b></code>, <code>bl.<b>readUInt8()</b></code></a>\n * <a href=\"#streams\">Streams</a>\n\n--------------------------------------------------------\n<a name=\"ctor\"></a>\n### new BufferList([ callback | buffer | buffer array ])\nThe constructor takes an optional callback, if supplied, the callback will be called with an error argument followed by a reference to the **bl** instance, when `bl.end()` is called (i.e. from a piped stream). This is a convenient method of collecting the entire contents of a stream, particularly when the stream is *chunky*, such as a network stream.\n\nNormally, no arguments are required for the constructor, but you can initialise the list by passing in a single `Buffer` object or an array of `Buffer` object.\n\n`new` is not strictly required, if you don't instantiate a new object, it will be done automatically for you so you can create a new instance simply with:\n\n```js\nvar bl = require('bl')\nvar myinstance = bl()\n\n// equivilant to:\n\nvar BufferList = require('bl')\nvar myinstance = new BufferList()\n```\n\n--------------------------------------------------------\n<a name=\"length\"></a>\n### bl.length\nGet the length of the list in bytes. This is the sum of the lengths of all of the buffers contained in the list, minus any initial offset for a semi-consumed buffer at the beginning. Should accurately represent the total number of bytes that can be read from the list.\n\n--------------------------------------------------------\n<a name=\"append\"></a>\n### bl.append(buffer)\n`append(buffer)` adds an additional buffer or BufferList to the internal list.\n\n--------------------------------------------------------\n<a name=\"get\"></a>\n### bl.get(index)\n`get()` will return the byte at the specified index.\n\n--------------------------------------------------------\n<a name=\"slice\"></a>\n### bl.slice([ start, [ end ] ])\n`slice()` returns a new `Buffer` object containing the bytes within the range specified. Both `start` and `end` are optional and will default to the beginning and end of the list respectively.\n\nIf the requested range spans a single internal buffer then a slice of that buffer will be returned which shares the original memory range of that Buffer. If the range spans multiple buffers then copy operations will likely occur to give you a uniform Buffer.\n\n--------------------------------------------------------\n<a name=\"copy\"></a>\n### bl.copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])\n`copy()` copies the content of the list in the `dest` buffer, starting from `destStart` and containing the bytes within the range specified with `srcStart` to `srcEnd`. `destStart`, `start` and `end` are optional and will default to the beginning of the `dest` buffer, and the beginning and end of the list respectively.\n\n--------------------------------------------------------\n<a name=\"duplicate\"></a>\n### bl.duplicate()\n`duplicate()` performs a **shallow-copy** of the list. The internal Buffers remains the same, so if you change the underlying Buffers, the change will be reflected in both the original and the duplicate. This method is needed if you want to call `consume()` or `pipe()` and still keep the original list.Example:\n\n```js\nvar bl = new BufferList()\n\nbl.append('hello')\nbl.append(' world')\nbl.append('\\n')\n\nbl.duplicate().pipe(process.stdout, { end: false })\n\nconsole.log(bl.toString())\n```\n\n--------------------------------------------------------\n<a name=\"consume\"></a>\n### bl.consume(bytes)\n`consume()` will shift bytes *off the start of the list*. The number of bytes consumed don't need to line up with the sizes of the internal Buffers&mdash;initial offsets will be calculated accordingly in order to give you a consistent view of the data.\n\n--------------------------------------------------------\n<a name=\"toString\"></a>\n### bl.toString([encoding, [ start, [ end ]]])\n`toString()` will return a string representation of the buffer. The optional `start` and `end` arguments are passed on to `slice()`, while the `encoding` is passed on to `toString()` of the resulting Buffer. See the [Buffer#toString()](http://nodejs.org/docs/latest/api/buffer.html#buffer_buf_tostring_encoding_start_end) documentation for more information.\n\n--------------------------------------------------------\n<a name=\"readXX\"></a>\n### bl.readDoubleBE(), bl.readDoubleLE(), bl.readFloatBE(), bl.readFloatLE(), bl.readInt32BE(), bl.readInt32LE(), bl.readUInt32BE(), bl.readUInt32LE(), bl.readInt16BE(), bl.readInt16LE(), bl.readUInt16BE(), bl.readUInt16LE(), bl.readInt8(), bl.readUInt8()\n\nAll of the standard byte-reading methods of the `Buffer` interface are implemented and will operate across internal Buffer boundaries transparently.\n\nSee the <b><code>[Buffer](http://nodejs.org/docs/latest/api/buffer.html)</code></b> documentation for how these work.\n\n--------------------------------------------------------\n<a name=\"streams\"></a>\n### Streams\n**bl** is a Node **[Duplex Stream](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_duplex)**, so it can be read from and written to like a standard Node stream. You can also `pipe()` to and from a **bl** instance.\n\n--------------------------------------------------------\n\n## Contributors\n\n**bl** is brought to you by the following hackers:\n\n * [Rod Vagg](https://github.com/rvagg)\n * [Matteo Collina](https://github.com/mcollina)\n * [Jarett Cruger](https://github.com/jcrugzz)\n\n=======\n\n<a name=\"license\"></a>\n## License &amp; copyright\n\nCopyright (c) 2013-2014 bl contributors (listed above).\n\nbl is licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.\n",
+ "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/rvagg/bl/issues"
},
"_id": "bl@0.9.4",
"_shasum": "4702ddf72fbe0ecd82787c00c113aea1935ad0e7",
- "_from": "bl@>=0.9.0 <0.10.0",
- "_npmVersion": "2.1.18",
- "_nodeVersion": "1.0.3",
- "_npmUser": {
- "name": "rvagg",
- "email": "rod@vagg.org"
- },
- "maintainers": [
- {
- "name": "rvagg",
- "email": "rod@vagg.org"
- }
- ],
- "dist": {
- "shasum": "4702ddf72fbe0ecd82787c00c113aea1935ad0e7",
- "tarball": "http://registry.npmjs.org/bl/-/bl-0.9.4.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz"
+ "_resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz",
+ "_from": "bl@>=0.9.0 <0.10.0"
}
diff --git a/node_modules/request/node_modules/caseless/package.json b/node_modules/request/node_modules/caseless/package.json
index 362113c6d..7df742743 100644
--- a/node_modules/request/node_modules/caseless/package.json
+++ b/node_modules/request/node_modules/caseless/package.json
@@ -1,6 +1,6 @@
{
"name": "caseless",
- "version": "0.9.0",
+ "version": "0.10.0",
"description": "Caseless object set/get/has, very useful when working with HTTP headers.",
"main": "index.js",
"scripts": {
@@ -27,11 +27,11 @@
"devDependencies": {
"tape": "^2.10.2"
},
- "gitHead": "5ff0ccebbbf14dad5dc91def1f274887801db3e3",
+ "gitHead": "9c85efef6c37d48923b79f3f282441414dd691c9",
"homepage": "https://github.com/mikeal/caseless",
- "_id": "caseless@0.9.0",
- "_shasum": "b7b65ce6bf1413886539cfd533f0b30effa9cf88",
- "_from": "caseless@>=0.9.0 <0.10.0",
+ "_id": "caseless@0.10.0",
+ "_shasum": "ed6b2719adcd1fd18f58dc081c0f1a5b43963909",
+ "_from": "caseless@>=0.10.0 <0.11.0",
"_npmVersion": "1.4.14",
"_npmUser": {
"name": "nylen",
@@ -48,9 +48,9 @@
}
],
"dist": {
- "shasum": "b7b65ce6bf1413886539cfd533f0b30effa9cf88",
- "tarball": "http://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz"
+ "shasum": "ed6b2719adcd1fd18f58dc081c0f1a5b43963909",
+ "tarball": "http://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz"
+ "_resolved": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz"
}
diff --git a/node_modules/request/node_modules/combined-stream/Readme.md b/node_modules/request/node_modules/combined-stream/Readme.md
index 8043cb48a..3068adcaf 100644
--- a/node_modules/request/node_modules/combined-stream/Readme.md
+++ b/node_modules/request/node_modules/combined-stream/Readme.md
@@ -1,7 +1,14 @@
-# combined-stream [![Build Status](https://travis-ci.org/felixge/node-combined-stream.svg?branch=master)](https://travis-ci.org/felixge/node-combined-stream)
+# combined-stream
A stream that emits multiple other streams one after another.
+**NB** This module uses streams1 and will always use streams1 for
+compatibility. If you're looking for something to use for your project, please
+use a streams2 module, e.g.,
+[multistream](https://www.npmjs.com/package/multistream). Moreover, this module
+is maintained for bugfixes to current downstream consumers, so PRs which add
+features generally aren't accepted.
+
## Installation
``` bash
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore
index 2fedb26cc..9daeafb98 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore
+++ b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore
@@ -1,2 +1 @@
-*.un~
-/node_modules/*
+test
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md
index 5cb5b35e5..aca36f9f0 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md
+++ b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md
@@ -108,19 +108,6 @@ characters.
If you know what you are doing, you can set this property to `Infinity` to
disable this feature. You can also modify this property during runtime.
-### delayedStream.maxDataSize = 1024 * 1024
-
-The amount of data to buffer before emitting an `error`.
-
-If the underlaying source is emitting `Buffer` objects, the `maxDataSize`
-refers to bytes.
-
-If the underlaying source is emitting JavaScript strings, the size refers to
-characters.
-
-If you know what you are doing, you can set this property to `Infinity` to
-disable this feature.
-
### delayedStream.dataSize = 0
The amount of data buffered so far.
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
index 7c10d4825..b38fc85ff 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
+++ b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
@@ -38,10 +38,18 @@ DelayedStream.create = function(source, options) {
return delayedStream;
};
-DelayedStream.prototype.__defineGetter__('readable', function() {
- return this.source.readable;
+Object.defineProperty(DelayedStream.prototype, 'readable', {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ return this.source.readable;
+ }
});
+DelayedStream.prototype.setEncoding = function() {
+ return this.source.setEncoding.apply(this.source, arguments);
+};
+
DelayedStream.prototype.resume = function() {
if (!this._released) {
this.release();
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json
index e76ce9318..ab9bbe4b8 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json
+++ b/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json
@@ -4,9 +4,16 @@
"email": "felix@debuggable.com",
"url": "http://debuggable.com/"
},
+ "contributors": [
+ {
+ "name": "Mike Atkins",
+ "email": "apeherder@gmail.com"
+ }
+ ],
"name": "delayed-stream",
"description": "Buffers events from a stream until you are ready to handle them.",
- "version": "0.0.5",
+ "license": "MIT",
+ "version": "1.0.0",
"homepage": "https://github.com/felixge/node-delayed-stream",
"repository": {
"type": "git",
@@ -16,23 +23,41 @@
"engines": {
"node": ">=0.4.0"
},
+ "scripts": {
+ "test": "make test"
+ },
"dependencies": {},
"devDependencies": {
"fake": "0.2.0",
"far": "0.0.1"
},
- "_id": "delayed-stream@0.0.5",
- "_engineSupported": true,
- "_npmVersion": "1.0.3",
- "_nodeVersion": "v0.4.9-pre",
- "_defaultsLoaded": true,
+ "gitHead": "07a9dc99fb8f1a488160026b9ad77493f766fb84",
+ "bugs": {
+ "url": "https://github.com/felixge/node-delayed-stream/issues"
+ },
+ "_id": "delayed-stream@1.0.0",
+ "_shasum": "df3ae199acadfb7d440aaae0b29e2272b24ec619",
+ "_from": "delayed-stream@>=1.0.0 <2.0.0",
+ "_npmVersion": "2.8.3",
+ "_nodeVersion": "1.6.4",
+ "_npmUser": {
+ "name": "apechimp",
+ "email": "apeherder@gmail.com"
+ },
"dist": {
- "shasum": "d4b1f43a93e8296dfe02694f4680bc37a313c73f",
- "tarball": "http://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
+ "shasum": "df3ae199acadfb7d440aaae0b29e2272b24ec619",
+ "tarball": "http://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
},
- "scripts": {},
+ "maintainers": [
+ {
+ "name": "felixge",
+ "email": "felix@debuggable.com"
+ },
+ {
+ "name": "apechimp",
+ "email": "apeherder@gmail.com"
+ }
+ ],
"directories": {},
- "_shasum": "d4b1f43a93e8296dfe02694f4680bc37a313c73f",
- "_resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
- "_from": "delayed-stream@0.0.5"
+ "_resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
}
diff --git a/node_modules/request/node_modules/combined-stream/package.json b/node_modules/request/node_modules/combined-stream/package.json
index a609ec116..f0ad40172 100644
--- a/node_modules/request/node_modules/combined-stream/package.json
+++ b/node_modules/request/node_modules/combined-stream/package.json
@@ -6,7 +6,7 @@
},
"name": "combined-stream",
"description": "A stream that emits multiple other streams one after another.",
- "version": "0.0.7",
+ "version": "1.0.3",
"homepage": "https://github.com/felixge/node-combined-stream",
"repository": {
"type": "git",
@@ -20,24 +20,28 @@
"node": ">= 0.8"
},
"dependencies": {
- "delayed-stream": "0.0.5"
+ "delayed-stream": "^1.0.0"
},
"devDependencies": {
"far": "~0.0.7"
},
+ "license": "MIT",
+ "gitHead": "f1a12682aed63acb3cd66857104202a7e7ca5565",
"bugs": {
"url": "https://github.com/felixge/node-combined-stream/issues"
},
- "_id": "combined-stream@0.0.7",
- "dist": {
- "shasum": "0137e657baa5a7541c57ac37ac5fc07d73b4dc1f",
- "tarball": "http://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz"
- },
- "_from": "combined-stream@>=0.0.5 <0.1.0",
- "_npmVersion": "1.4.3",
+ "_id": "combined-stream@1.0.3",
+ "_shasum": "c224cc35d3cb98e25dead532472a18e8f75df5ab",
+ "_from": "combined-stream@>=1.0.1 <1.1.0",
+ "_npmVersion": "2.10.0",
+ "_nodeVersion": "2.0.1",
"_npmUser": {
- "name": "felixge",
- "email": "felix@debuggable.com"
+ "name": "apechimp",
+ "email": "apeherder@gmail.com"
+ },
+ "dist": {
+ "shasum": "c224cc35d3cb98e25dead532472a18e8f75df5ab",
+ "tarball": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.3.tgz"
},
"maintainers": [
{
@@ -46,14 +50,17 @@
},
{
"name": "celer",
- "email": "celer@scrypt.net"
+ "email": "dtyree77@gmail.com"
},
{
"name": "alexindigo",
"email": "iam@alexindigo.com"
+ },
+ {
+ "name": "apechimp",
+ "email": "apeherder@gmail.com"
}
],
"directories": {},
- "_shasum": "0137e657baa5a7541c57ac37ac5fc07d73b4dc1f",
- "_resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz"
+ "_resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.3.tgz"
}
diff --git a/node_modules/request/node_modules/forever-agent/package.json b/node_modules/request/node_modules/forever-agent/package.json
index 562396419..7bdaaaff0 100644
--- a/node_modules/request/node_modules/forever-agent/package.json
+++ b/node_modules/request/node_modules/forever-agent/package.json
@@ -9,7 +9,7 @@
"version": "0.6.1",
"license": "Apache-2.0",
"repository": {
- "url": "https://github.com/mikeal/forever-agent"
+ "url": "git+https://github.com/mikeal/forever-agent.git"
},
"main": "index.js",
"dependencies": {},
@@ -18,38 +18,14 @@
"engines": {
"node": "*"
},
- "gitHead": "1b3b6163f2b3c2c4122bbfa288c1325c0df9871d",
+ "readme": "forever-agent\n=============\n\nHTTP Agent that keeps socket connections alive between keep-alive requests. Formerly part of mikeal/request, now a standalone module.\n",
+ "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/mikeal/forever-agent/issues"
},
- "homepage": "https://github.com/mikeal/forever-agent",
+ "homepage": "https://github.com/mikeal/forever-agent#readme",
"_id": "forever-agent@0.6.1",
- "scripts": {},
"_shasum": "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91",
- "_from": "forever-agent@>=0.6.0 <0.7.0",
- "_npmVersion": "1.4.28",
- "_npmUser": {
- "name": "simov",
- "email": "simeonvelichkov@gmail.com"
- },
- "maintainers": [
- {
- "name": "mikeal",
- "email": "mikeal.rogers@gmail.com"
- },
- {
- "name": "nylen",
- "email": "jnylen@gmail.com"
- },
- {
- "name": "simov",
- "email": "simeonvelichkov@gmail.com"
- }
- ],
- "dist": {
- "shasum": "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91",
- "tarball": "http://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ "_resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "_from": "forever-agent@>=0.6.0 <0.7.0"
}
diff --git a/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml b/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml
index 6e5919de3..6064ca092 100644
--- a/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml
+++ b/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml
@@ -1,3 +1,5 @@
language: node_js
node_js:
- "0.10"
+ - "0.12"
+ - "iojs"
diff --git a/node_modules/request/node_modules/form-data/node_modules/async/README.md b/node_modules/request/node_modules/form-data/node_modules/async/README.md
index 0bea5311a..6cfb922c5 100644
--- a/node_modules/request/node_modules/form-data/node_modules/async/README.md
+++ b/node_modules/request/node_modules/form-data/node_modules/async/README.md
@@ -5,8 +5,16 @@
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), it can also be used directly in the
-browser. Also supports [component](https://github.com/component/component).
+use with [Node.js](http://nodejs.org) and installable via `npm install async`,
+it can also be used directly in the browser.
+
+Async is also installable via:
+
+- [bower](http://bower.io/): `bower install async`
+- [component](https://github.com/component/component): `component install
+ caolan/async`
+- [jam](http://jamjs.org/): `jam install async`
+- [spm](http://spmjs.io/): `spm install async`
Async provides around 20 functions that include the usual 'functional'
suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns
@@ -182,7 +190,7 @@ __Arguments__
* `arr` - An array to iterate over.
* `iterator(item, callback)` - A function to apply to each item in `arr`.
The iterator is passed a `callback(err)` which must be called once it has
- completed. If no error has occured, the `callback` should be run without
+ completed. If no error has occurred, the `callback` should be run without
arguments or with an explicit `null` argument.
* `callback(err)` - A callback which is called when all `iterator` functions
have finished, or an error occurs.
@@ -202,7 +210,7 @@ async.each(openFiles, saveFile, function(err){
```js
// assuming openFiles is an array of file names
-async.each(openFiles, function( file, callback) {
+async.each(openFiles, function(file, callback) {
// Perform operation on file here.
console.log('Processing file ' + file);
@@ -256,7 +264,7 @@ __Arguments__
* `limit` - The maximum number of `iterator`s to run at any time.
* `iterator(item, callback)` - A function to apply to each item in `arr`.
The iterator is passed a `callback(err)` which must be called once it has
- completed. If no error has occured, the callback should be run without
+ completed. If no error has occurred, the callback should be run without
arguments or with an explicit `null` argument.
* `callback(err)` - A callback which is called when all `iterator` functions
have finished, or an error occurs.
@@ -280,7 +288,7 @@ async.eachLimit(documents, 20, requestApi, function(err){
Produces a new array of values by mapping each value in `arr` through
the `iterator` function. The `iterator` is called with an item from `arr` and a
callback for when it has finished processing. Each of these callback takes 2 arguments:
-an `error`, and the transformed item from `arr`. If `iterator` passes an error to this
+an `error`, and the transformed item from `arr`. If `iterator` passes an error to his
callback, the main `callback` (for the `map` function) is immediately called with the error.
Note, that since this function applies the `iterator` to each item in parallel,
@@ -536,14 +544,14 @@ By modifying the callback parameter the sorting order can be influenced:
```js
//ascending order
async.sortBy([1,9,3,5], function(x, callback){
- callback(err, x);
+ callback(null, x);
}, function(err,result){
//result callback
} );
//descending order
async.sortBy([1,9,3,5], function(x, callback){
- callback(err, x*-1); //<- x*-1 instead of x, turns the order around
+ callback(null, x*-1); //<- x*-1 instead of x, turns the order around
}, function(err,result){
//result callback
} );
@@ -913,19 +921,19 @@ __Example__
```js
async.waterfall([
- function(callback){
+ function(callback) {
callback(null, 'one', 'two');
},
- function(arg1, arg2, callback){
+ function(arg1, arg2, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
},
- function(arg1, callback){
+ function(arg1, callback) {
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
- // result now equals 'done'
+ // result now equals 'done'
});
```
@@ -972,7 +980,8 @@ add1mul3(4, function (err, result) {
### seq(fn1, fn2...)
Version of the compose function that is more natural to read.
-Each following function consumes the return value of the latter function.
+Each function consumes the return value of the previous function.
+It is the equivalent of [`compose`](#compose) with the arguments reversed.
Each function is executed with the `this` binding of the composed function.
@@ -989,28 +998,20 @@ __Example__
// This example uses `seq` function to avoid overnesting and error
// handling clutter.
app.get('/cats', function(request, response) {
- function handleError(err, data, callback) {
- if (err) {
- console.error(err);
- response.json({ status: 'error', message: err.message });
- }
- else {
- callback(data);
- }
- }
var User = request.models.User;
async.seq(
_.bind(User.get, User), // 'User.get' has signature (id, callback(err, data))
- handleError,
function(user, fn) {
user.getCats(fn); // 'getCats' has signature (callback(err, data))
- },
- handleError,
- function(cats) {
+ }
+ )(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 });
}
- )(req.session.user_id);
- }
+ });
});
```
@@ -1092,7 +1093,7 @@ methods:
* `paused` - a boolean for determining whether the queue is in a paused state
* `pause()` - a function that pauses the processing of tasks until `resume()` is called.
* `resume()` - a function that resumes the processing of queued tasks when the queue is paused.
-* `kill()` - a function that empties remaining tasks from the queue forcing it to go idle.
+* `kill()` - a function that removes the `drain` callback and empties remaining tasks from the queue forcing it to go idle.
__Example__
@@ -1122,7 +1123,7 @@ q.push({name: 'bar'}, function (err) {
// add some items to the queue (batch-wise)
q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {
- console.log('finished processing bar');
+ console.log('finished processing item');
});
// add some items to the front of the queue
@@ -1349,7 +1350,7 @@ new tasks much easier (and the code more readable).
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 successfull task. If all attemps fail, the callback will be passed the error and
+of the successful task. If all attempts fail, the callback will be passed the error and
result (if any) of the final attempt.
__Arguments__
@@ -1474,7 +1475,7 @@ three
---------------------------------------
<a name="nextTick" />
-### nextTick(callback)
+### nextTick(callback), setImmediate(callback)
Calls `callback` on a later loop around the event loop. In Node.js this just
calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)`
diff --git a/node_modules/request/node_modules/form-data/node_modules/async/bower.json b/node_modules/request/node_modules/form-data/node_modules/async/bower.json
new file mode 100644
index 000000000..18176881e
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/async/bower.json
@@ -0,0 +1,38 @@
+{
+ "name": "async",
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "version": "0.9.2",
+ "main": "lib/async.js",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/caolan/async.git"
+ },
+ "devDependencies": {
+ "nodeunit": ">0.0.0",
+ "uglify-js": "1.2.x",
+ "nodelint": ">0.0.0",
+ "lodash": ">=2.4.1"
+ },
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "authors": [
+ "Caolan McMahon"
+ ]
+} \ No newline at end of file
diff --git a/node_modules/request/node_modules/form-data/node_modules/async/component.json b/node_modules/request/node_modules/form-data/node_modules/async/component.json
index bbb011548..5003a7c52 100644
--- a/node_modules/request/node_modules/form-data/node_modules/async/component.json
+++ b/node_modules/request/node_modules/form-data/node_modules/async/component.json
@@ -1,11 +1,16 @@
{
"name": "async",
- "repo": "caolan/async",
"description": "Higher-order functions and common patterns for asynchronous code",
- "version": "0.1.23",
- "keywords": [],
- "dependencies": {},
- "development": {},
- "main": "lib/async.js",
- "scripts": [ "lib/async.js" ]
-}
+ "version": "0.9.2",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "repository": "caolan/async",
+ "scripts": [
+ "lib/async.js"
+ ]
+} \ No newline at end of file
diff --git a/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js b/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
index 01e8afcc4..394c41cad 100755..100644
--- a/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
+++ b/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
@@ -42,9 +42,6 @@
};
var _each = function (arr, iterator) {
- if (arr.forEach) {
- return arr.forEach(iterator);
- }
for (var i = 0; i < arr.length; i += 1) {
iterator(arr[i], i, arr);
}
@@ -821,23 +818,26 @@
pause: function () {
if (q.paused === true) { return; }
q.paused = true;
- q.process();
},
resume: function () {
if (q.paused === false) { return; }
q.paused = false;
- q.process();
+ // Need to call q.process once per concurrent
+ // worker to preserve full concurrency after pause
+ for (var w = 1; w <= q.concurrency; w++) {
+ async.setImmediate(q.process);
+ }
}
};
return q;
};
-
+
async.priorityQueue = function (worker, concurrency) {
-
+
function _compareTasks(a, b){
return a.priority - b.priority;
};
-
+
function _binarySearch(sequence, item, compare) {
var beg = -1,
end = sequence.length - 1;
@@ -851,7 +851,7 @@
}
return beg;
}
-
+
function _insert(q, data, priority, callback) {
if (!q.started){
q.started = true;
@@ -873,7 +873,7 @@
priority: priority,
callback: typeof callback === 'function' ? callback : null
};
-
+
q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
if (q.saturated && q.tasks.length === q.concurrency) {
@@ -882,15 +882,15 @@
async.setImmediate(q.process);
});
}
-
+
// Start with a normal queue
var q = async.queue(worker, concurrency);
-
+
// Override push to accept second parameter representing priority
q.push = function (data, priority, callback) {
_insert(q, data, priority, callback);
};
-
+
// Remove unshift function
delete q.unshift;
diff --git a/node_modules/request/node_modules/form-data/node_modules/async/package.json b/node_modules/request/node_modules/form-data/node_modules/async/package.json
index 3171f4af0..98c2e0b4e 100644
--- a/node_modules/request/node_modules/form-data/node_modules/async/package.json
+++ b/node_modules/request/node_modules/form-data/node_modules/async/package.json
@@ -1,28 +1,30 @@
{
"name": "async",
"description": "Higher-order functions and common patterns for asynchronous code",
- "main": "./lib/async",
+ "main": "lib/async.js",
"author": {
"name": "Caolan McMahon"
},
- "version": "0.9.0",
+ "version": "0.9.2",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
"repository": {
"type": "git",
- "url": "https://github.com/caolan/async.git"
+ "url": "git+https://github.com/caolan/async.git"
},
"bugs": {
"url": "https://github.com/caolan/async/issues"
},
- "licenses": [
- {
- "type": "MIT",
- "url": "https://github.com/caolan/async/raw/master/LICENSE"
- }
- ],
+ "license": "MIT",
"devDependencies": {
"nodeunit": ">0.0.0",
"uglify-js": "1.2.x",
- "nodelint": ">0.0.0"
+ "nodelint": ">0.0.0",
+ "lodash": ">=2.4.1"
},
"jam": {
"main": "lib/async.js",
@@ -30,30 +32,53 @@
"lib/async.js",
"README.md",
"LICENSE"
+ ],
+ "categories": [
+ "Utilities"
]
},
"scripts": {
"test": "nodeunit test/test-async.js"
},
- "homepage": "https://github.com/caolan/async",
- "_id": "async@0.9.0",
- "dist": {
- "shasum": "ac3613b1da9bed1b47510bb4651b8931e47146c7",
- "tarball": "http://registry.npmjs.org/async/-/async-0.9.0.tgz"
+ "spm": {
+ "main": "lib/async.js"
},
+ "volo": {
+ "main": "lib/async.js",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ]
+ },
+ "gitHead": "de3a16091d5125384eff4a54deb3998b13c3814c",
+ "homepage": "https://github.com/caolan/async#readme",
+ "_id": "async@0.9.2",
+ "_shasum": "aea74d5e61c1f899613bf64bda66d4c78f2fd17d",
"_from": "async@>=0.9.0 <0.10.0",
- "_npmVersion": "1.4.3",
+ "_npmVersion": "2.9.0",
+ "_nodeVersion": "2.0.1",
"_npmUser": {
- "name": "caolan",
- "email": "caolan.mcmahon@gmail.com"
+ "name": "beaugunderson",
+ "email": "beau@beaugunderson.com"
},
"maintainers": [
{
"name": "caolan",
- "email": "caolan@caolanmcmahon.com"
+ "email": "caolan.mcmahon@gmail.com"
+ },
+ {
+ "name": "beaugunderson",
+ "email": "beau@beaugunderson.com"
}
],
+ "dist": {
+ "shasum": "aea74d5e61c1f899613bf64bda66d4c78f2fd17d",
+ "tarball": "http://registry.npmjs.org/async/-/async-0.9.2.tgz"
+ },
"directories": {},
- "_shasum": "ac3613b1da9bed1b47510bb4651b8931e47146c7",
- "_resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
+ "_resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/form-data/node_modules/async/support/sync-package-managers.js b/node_modules/request/node_modules/form-data/node_modules/async/support/sync-package-managers.js
new file mode 100755
index 000000000..30cb7c2d0
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/async/support/sync-package-managers.js
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+
+// This should probably be its own module but complaints about bower/etc.
+// support keep coming up and I'd rather just enable the workflow here for now
+// and figure out where this should live later. -- @beaugunderson
+
+var fs = require('fs');
+var _ = require('lodash');
+
+var packageJson = require('../package.json');
+
+var IGNORES = ['**/.*', 'node_modules', 'bower_components', 'test', 'tests'];
+var INCLUDES = ['lib/async.js', 'README.md', 'LICENSE'];
+var REPOSITORY_NAME = 'caolan/async';
+
+packageJson.jam = {
+ main: packageJson.main,
+ include: INCLUDES,
+ categories: ['Utilities']
+};
+
+packageJson.spm = {
+ main: packageJson.main
+};
+
+packageJson.volo = {
+ main: packageJson.main,
+ ignore: IGNORES
+};
+
+var bowerSpecific = {
+ moduleType: ['amd', 'globals', 'node'],
+ ignore: IGNORES,
+ authors: [packageJson.author]
+};
+
+var bowerInclude = ['name', 'description', 'version', 'main', 'keywords',
+ 'license', 'homepage', 'repository', 'devDependencies'];
+
+var componentSpecific = {
+ repository: REPOSITORY_NAME,
+ scripts: [packageJson.main]
+};
+
+var componentInclude = ['name', 'description', 'version', 'keywords',
+ 'license'];
+
+var bowerJson = _.merge({}, _.pick(packageJson, bowerInclude), bowerSpecific);
+var componentJson = _.merge({}, _.pick(packageJson, componentInclude), componentSpecific);
+
+fs.writeFileSync('./bower.json', JSON.stringify(bowerJson, null, 2));
+fs.writeFileSync('./component.json', JSON.stringify(componentJson, null, 2));
+fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2));
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/License b/node_modules/request/node_modules/form-data/node_modules/combined-stream/License
new file mode 100644
index 000000000..4804b7ab4
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/License
@@ -0,0 +1,19 @@
+Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md b/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md
new file mode 100644
index 000000000..8043cb48a
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md
@@ -0,0 +1,132 @@
+# combined-stream [![Build Status](https://travis-ci.org/felixge/node-combined-stream.svg?branch=master)](https://travis-ci.org/felixge/node-combined-stream)
+
+A stream that emits multiple other streams one after another.
+
+## Installation
+
+``` bash
+npm install combined-stream
+```
+
+## Usage
+
+Here is a simple example that shows how you can use combined-stream to combine
+two files into one:
+
+``` javascript
+var CombinedStream = require('combined-stream');
+var fs = require('fs');
+
+var combinedStream = CombinedStream.create();
+combinedStream.append(fs.createReadStream('file1.txt'));
+combinedStream.append(fs.createReadStream('file2.txt'));
+
+combinedStream.pipe(fs.createWriteStream('combined.txt'));
+```
+
+While the example above works great, it will pause all source streams until
+they are needed. If you don't want that to happen, you can set `pauseStreams`
+to `false`:
+
+``` javascript
+var CombinedStream = require('combined-stream');
+var fs = require('fs');
+
+var combinedStream = CombinedStream.create({pauseStreams: false});
+combinedStream.append(fs.createReadStream('file1.txt'));
+combinedStream.append(fs.createReadStream('file2.txt'));
+
+combinedStream.pipe(fs.createWriteStream('combined.txt'));
+```
+
+However, what if you don't have all the source streams yet, or you don't want
+to allocate the resources (file descriptors, memory, etc.) for them right away?
+Well, in that case you can simply provide a callback that supplies the stream
+by calling a `next()` function:
+
+``` javascript
+var CombinedStream = require('combined-stream');
+var fs = require('fs');
+
+var combinedStream = CombinedStream.create();
+combinedStream.append(function(next) {
+ next(fs.createReadStream('file1.txt'));
+});
+combinedStream.append(function(next) {
+ next(fs.createReadStream('file2.txt'));
+});
+
+combinedStream.pipe(fs.createWriteStream('combined.txt'));
+```
+
+## API
+
+### CombinedStream.create([options])
+
+Returns a new combined stream object. Available options are:
+
+* `maxDataSize`
+* `pauseStreams`
+
+The effect of those options is described below.
+
+### combinedStream.pauseStreams = `true`
+
+Whether to apply back pressure to the underlaying streams. If set to `false`,
+the underlaying streams will never be paused. If set to `true`, the
+underlaying streams will be paused right after being appended, as well as when
+`delayedStream.pipe()` wants to throttle.
+
+### combinedStream.maxDataSize = `2 * 1024 * 1024`
+
+The maximum amount of bytes (or characters) to buffer for all source streams.
+If this value is exceeded, `combinedStream` emits an `'error'` event.
+
+### combinedStream.dataSize = `0`
+
+The amount of bytes (or characters) currently buffered by `combinedStream`.
+
+### combinedStream.append(stream)
+
+Appends the given `stream` to the combinedStream object. If `pauseStreams` is
+set to `true, this stream will also be paused right away.
+
+`streams` can also be a function that takes one parameter called `next`. `next`
+is a function that must be invoked in order to provide the `next` stream, see
+example above.
+
+Regardless of how the `stream` is appended, combined-stream always attaches an
+`'error'` listener to it, so you don't have to do that manually.
+
+Special case: `stream` can also be a String or Buffer.
+
+### combinedStream.write(data)
+
+You should not call this, `combinedStream` takes care of piping the appended
+streams into itself for you.
+
+### combinedStream.resume()
+
+Causes `combinedStream` to start drain the streams it manages. The function is
+idempotent, and also emits a `'resume'` event each time which usually goes to
+the stream that is currently being drained.
+
+### combinedStream.pause();
+
+If `combinedStream.pauseStreams` is set to `false`, this does nothing.
+Otherwise a `'pause'` event is emitted, this goes to the stream that is
+currently being drained, so you can use it to apply back pressure.
+
+### combinedStream.end();
+
+Sets `combinedStream.writable` to false, emits an `'end'` event, and removes
+all streams from the queue.
+
+### combinedStream.destroy();
+
+Same as `combinedStream.end()`, except it emits a `'close'` event instead of
+`'end'`.
+
+## License
+
+combined-stream is licensed under the MIT license.
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js
new file mode 100644
index 000000000..6b5c21b6b
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js
@@ -0,0 +1,188 @@
+var util = require('util');
+var Stream = require('stream').Stream;
+var DelayedStream = require('delayed-stream');
+
+module.exports = CombinedStream;
+function CombinedStream() {
+ this.writable = false;
+ this.readable = true;
+ this.dataSize = 0;
+ this.maxDataSize = 2 * 1024 * 1024;
+ this.pauseStreams = true;
+
+ this._released = false;
+ this._streams = [];
+ this._currentStream = null;
+}
+util.inherits(CombinedStream, Stream);
+
+CombinedStream.create = function(options) {
+ var combinedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ combinedStream[option] = options[option];
+ }
+
+ return combinedStream;
+};
+
+CombinedStream.isStreamLike = function(stream) {
+ return (typeof stream !== 'function')
+ && (typeof stream !== 'string')
+ && (typeof stream !== 'boolean')
+ && (typeof stream !== 'number')
+ && (!Buffer.isBuffer(stream));
+};
+
+CombinedStream.prototype.append = function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+
+ if (isStreamLike) {
+ if (!(stream instanceof DelayedStream)) {
+ var newStream = DelayedStream.create(stream, {
+ maxDataSize: Infinity,
+ pauseStream: this.pauseStreams,
+ });
+ stream.on('data', this._checkDataSize.bind(this));
+ stream = newStream;
+ }
+
+ this._handleErrors(stream);
+
+ if (this.pauseStreams) {
+ stream.pause();
+ }
+ }
+
+ this._streams.push(stream);
+ return this;
+};
+
+CombinedStream.prototype.pipe = function(dest, options) {
+ Stream.prototype.pipe.call(this, dest, options);
+ this.resume();
+ return dest;
+};
+
+CombinedStream.prototype._getNext = function() {
+ this._currentStream = null;
+ var stream = this._streams.shift();
+
+
+ if (typeof stream == 'undefined') {
+ this.end();
+ return;
+ }
+
+ if (typeof stream !== 'function') {
+ this._pipeNext(stream);
+ return;
+ }
+
+ var getStream = stream;
+ getStream(function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('data', this._checkDataSize.bind(this));
+ this._handleErrors(stream);
+ }
+
+ this._pipeNext(stream);
+ }.bind(this));
+};
+
+CombinedStream.prototype._pipeNext = function(stream) {
+ this._currentStream = stream;
+
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('end', this._getNext.bind(this));
+ stream.pipe(this, {end: false});
+ return;
+ }
+
+ var value = stream;
+ this.write(value);
+ this._getNext();
+};
+
+CombinedStream.prototype._handleErrors = function(stream) {
+ var self = this;
+ stream.on('error', function(err) {
+ self._emitError(err);
+ });
+};
+
+CombinedStream.prototype.write = function(data) {
+ this.emit('data', data);
+};
+
+CombinedStream.prototype.pause = function() {
+ if (!this.pauseStreams) {
+ return;
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
+ this.emit('pause');
+};
+
+CombinedStream.prototype.resume = function() {
+ if (!this._released) {
+ this._released = true;
+ this.writable = true;
+ this._getNext();
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
+ this.emit('resume');
+};
+
+CombinedStream.prototype.end = function() {
+ this._reset();
+ this.emit('end');
+};
+
+CombinedStream.prototype.destroy = function() {
+ this._reset();
+ this.emit('close');
+};
+
+CombinedStream.prototype._reset = function() {
+ this.writable = false;
+ this._streams = [];
+ this._currentStream = null;
+};
+
+CombinedStream.prototype._checkDataSize = function() {
+ this._updateDataSize();
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
+ this._emitError(new Error(message));
+};
+
+CombinedStream.prototype._updateDataSize = function() {
+ this.dataSize = 0;
+
+ var self = this;
+ this._streams.forEach(function(stream) {
+ if (!stream.dataSize) {
+ return;
+ }
+
+ self.dataSize += stream.dataSize;
+ });
+
+ if (this._currentStream && this._currentStream.dataSize) {
+ this.dataSize += this._currentStream.dataSize;
+ }
+};
+
+CombinedStream.prototype._emitError = function(err) {
+ this._reset();
+ this.emit('error', err);
+};
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore
new file mode 100644
index 000000000..2fedb26cc
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore
@@ -0,0 +1,2 @@
+*.un~
+/node_modules/*
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License
new file mode 100644
index 000000000..4804b7ab4
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License
@@ -0,0 +1,19 @@
+Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile
new file mode 100644
index 000000000..b4ff85a33
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile
@@ -0,0 +1,7 @@
+SHELL := /bin/bash
+
+test:
+ @./test/run.js
+
+.PHONY: test
+
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md
new file mode 100644
index 000000000..5cb5b35e5
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md
@@ -0,0 +1,154 @@
+# delayed-stream
+
+Buffers events from a stream until you are ready to handle them.
+
+## Installation
+
+``` bash
+npm install delayed-stream
+```
+
+## Usage
+
+The following example shows how to write a http echo server that delays its
+response by 1000 ms.
+
+``` javascript
+var DelayedStream = require('delayed-stream');
+var http = require('http');
+
+http.createServer(function(req, res) {
+ var delayed = DelayedStream.create(req);
+
+ setTimeout(function() {
+ res.writeHead(200);
+ delayed.pipe(res);
+ }, 1000);
+});
+```
+
+If you are not using `Stream#pipe`, you can also manually release the buffered
+events by calling `delayedStream.resume()`:
+
+``` javascript
+var delayed = DelayedStream.create(req);
+
+setTimeout(function() {
+ // Emit all buffered events and resume underlaying source
+ delayed.resume();
+}, 1000);
+```
+
+## Implementation
+
+In order to use this meta stream properly, here are a few things you should
+know about the implementation.
+
+### Event Buffering / Proxying
+
+All events of the `source` stream are hijacked by overwriting the `source.emit`
+method. Until node implements a catch-all event listener, this is the only way.
+
+However, delayed-stream still continues to emit all events it captures on the
+`source`, regardless of whether you have released the delayed stream yet or
+not.
+
+Upon creation, delayed-stream captures all `source` events and stores them in
+an internal event buffer. Once `delayedStream.release()` is called, all
+buffered events are emitted on the `delayedStream`, and the event buffer is
+cleared. After that, delayed-stream merely acts as a proxy for the underlaying
+source.
+
+### Error handling
+
+Error events on `source` are buffered / proxied just like any other events.
+However, `delayedStream.create` attaches a no-op `'error'` listener to the
+`source`. This way you only have to handle errors on the `delayedStream`
+object, rather than in two places.
+
+### Buffer limits
+
+delayed-stream provides a `maxDataSize` property that can be used to limit
+the amount of data being buffered. In order to protect you from bad `source`
+streams that don't react to `source.pause()`, this feature is enabled by
+default.
+
+## API
+
+### DelayedStream.create(source, [options])
+
+Returns a new `delayedStream`. Available options are:
+
+* `pauseStream`
+* `maxDataSize`
+
+The description for those properties can be found below.
+
+### delayedStream.source
+
+The `source` stream managed by this object. This is useful if you are
+passing your `delayedStream` around, and you still want to access properties
+on the `source` object.
+
+### delayedStream.pauseStream = true
+
+Whether to pause the underlaying `source` when calling
+`DelayedStream.create()`. Modifying this property afterwards has no effect.
+
+### delayedStream.maxDataSize = 1024 * 1024
+
+The amount of data to buffer before emitting an `error`.
+
+If the underlaying source is emitting `Buffer` objects, the `maxDataSize`
+refers to bytes.
+
+If the underlaying source is emitting JavaScript strings, the size refers to
+characters.
+
+If you know what you are doing, you can set this property to `Infinity` to
+disable this feature. You can also modify this property during runtime.
+
+### delayedStream.maxDataSize = 1024 * 1024
+
+The amount of data to buffer before emitting an `error`.
+
+If the underlaying source is emitting `Buffer` objects, the `maxDataSize`
+refers to bytes.
+
+If the underlaying source is emitting JavaScript strings, the size refers to
+characters.
+
+If you know what you are doing, you can set this property to `Infinity` to
+disable this feature.
+
+### delayedStream.dataSize = 0
+
+The amount of data buffered so far.
+
+### delayedStream.readable
+
+An ECMA5 getter that returns the value of `source.readable`.
+
+### delayedStream.resume()
+
+If the `delayedStream` has not been released so far, `delayedStream.release()`
+is called.
+
+In either case, `source.resume()` is called.
+
+### delayedStream.pause()
+
+Calls `source.pause()`.
+
+### delayedStream.pipe(dest)
+
+Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`.
+
+### delayedStream.release()
+
+Emits and clears all events that have been buffered up so far. This does not
+resume the underlaying source, use `delayedStream.resume()` instead.
+
+## License
+
+delayed-stream is licensed under the MIT license.
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
new file mode 100644
index 000000000..7c10d4825
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
@@ -0,0 +1,99 @@
+var Stream = require('stream').Stream;
+var util = require('util');
+
+module.exports = DelayedStream;
+function DelayedStream() {
+ this.source = null;
+ this.dataSize = 0;
+ this.maxDataSize = 1024 * 1024;
+ this.pauseStream = true;
+
+ this._maxDataSizeExceeded = false;
+ this._released = false;
+ this._bufferedEvents = [];
+}
+util.inherits(DelayedStream, Stream);
+
+DelayedStream.create = function(source, options) {
+ var delayedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ delayedStream[option] = options[option];
+ }
+
+ delayedStream.source = source;
+
+ var realEmit = source.emit;
+ source.emit = function() {
+ delayedStream._handleEmit(arguments);
+ return realEmit.apply(source, arguments);
+ };
+
+ source.on('error', function() {});
+ if (delayedStream.pauseStream) {
+ source.pause();
+ }
+
+ return delayedStream;
+};
+
+DelayedStream.prototype.__defineGetter__('readable', function() {
+ return this.source.readable;
+});
+
+DelayedStream.prototype.resume = function() {
+ if (!this._released) {
+ this.release();
+ }
+
+ this.source.resume();
+};
+
+DelayedStream.prototype.pause = function() {
+ this.source.pause();
+};
+
+DelayedStream.prototype.release = function() {
+ this._released = true;
+
+ this._bufferedEvents.forEach(function(args) {
+ this.emit.apply(this, args);
+ }.bind(this));
+ this._bufferedEvents = [];
+};
+
+DelayedStream.prototype.pipe = function() {
+ var r = Stream.prototype.pipe.apply(this, arguments);
+ this.resume();
+ return r;
+};
+
+DelayedStream.prototype._handleEmit = function(args) {
+ if (this._released) {
+ this.emit.apply(this, args);
+ return;
+ }
+
+ if (args[0] === 'data') {
+ this.dataSize += args[1].length;
+ this._checkIfMaxDataSizeExceeded();
+ }
+
+ this._bufferedEvents.push(args);
+};
+
+DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
+ if (this._maxDataSizeExceeded) {
+ return;
+ }
+
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ this._maxDataSizeExceeded = true;
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
+ this.emit('error', new Error(message));
+};
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json
new file mode 100644
index 000000000..3324a13e9
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json
@@ -0,0 +1,42 @@
+{
+ "author": {
+ "name": "Felix Geisendörfer",
+ "email": "felix@debuggable.com",
+ "url": "http://debuggable.com/"
+ },
+ "name": "delayed-stream",
+ "description": "Buffers events from a stream until you are ready to handle them.",
+ "version": "0.0.5",
+ "homepage": "https://github.com/felixge/node-delayed-stream",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/felixge/node-delayed-stream.git"
+ },
+ "main": "./lib/delayed_stream",
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "fake": "0.2.0",
+ "far": "0.0.1"
+ },
+ "_id": "delayed-stream@0.0.5",
+ "_engineSupported": true,
+ "_npmVersion": "1.0.3",
+ "_nodeVersion": "v0.4.9-pre",
+ "_defaultsLoaded": true,
+ "dist": {
+ "shasum": "d4b1f43a93e8296dfe02694f4680bc37a313c73f",
+ "tarball": "http://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
+ },
+ "scripts": {},
+ "directories": {},
+ "_shasum": "d4b1f43a93e8296dfe02694f4680bc37a313c73f",
+ "_resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
+ "_from": "delayed-stream@0.0.5",
+ "bugs": {
+ "url": "https://github.com/felixge/node-delayed-stream/issues"
+ },
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/common.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js
index 4d71b8a64..4d71b8a64 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/common.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js
index 9ecad5b8a..9ecad5b8a 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js
index 6f417f3e9..6f417f3e9 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js
index b50c39783..b50c39783 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js
index fc4047e08..fc4047e08 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js
index a9d35e72c..a9d35e72c 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js
index 7638a2bf0..7638a2bf0 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js
index 7d312ab1f..7d312ab1f 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js
index d436163b7..d436163b7 100644
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js
diff --git a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/run.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js
index 0bb8e8224..0bb8e8224 100755
--- a/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/test/run.js
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js
diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json b/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json
new file mode 100644
index 000000000..57c38da67
--- /dev/null
+++ b/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json
@@ -0,0 +1,37 @@
+{
+ "author": {
+ "name": "Felix Geisendörfer",
+ "email": "felix@debuggable.com",
+ "url": "http://debuggable.com/"
+ },
+ "name": "combined-stream",
+ "description": "A stream that emits multiple other streams one after another.",
+ "version": "0.0.7",
+ "homepage": "https://github.com/felixge/node-combined-stream",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/felixge/node-combined-stream.git"
+ },
+ "main": "./lib/combined_stream",
+ "scripts": {
+ "test": "node test/run.js"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "dependencies": {
+ "delayed-stream": "0.0.5"
+ },
+ "devDependencies": {
+ "far": "~0.0.7"
+ },
+ "readme": "# combined-stream [![Build Status](https://travis-ci.org/felixge/node-combined-stream.svg?branch=master)](https://travis-ci.org/felixge/node-combined-stream)\n\nA stream that emits multiple other streams one after another.\n\n## Installation\n\n``` bash\nnpm install combined-stream\n```\n\n## Usage\n\nHere is a simple example that shows how you can use combined-stream to combine\ntwo files into one:\n\n``` javascript\nvar CombinedStream = require('combined-stream');\nvar fs = require('fs');\n\nvar combinedStream = CombinedStream.create();\ncombinedStream.append(fs.createReadStream('file1.txt'));\ncombinedStream.append(fs.createReadStream('file2.txt'));\n\ncombinedStream.pipe(fs.createWriteStream('combined.txt'));\n```\n\nWhile the example above works great, it will pause all source streams until\nthey are needed. If you don't want that to happen, you can set `pauseStreams`\nto `false`:\n\n``` javascript\nvar CombinedStream = require('combined-stream');\nvar fs = require('fs');\n\nvar combinedStream = CombinedStream.create({pauseStreams: false});\ncombinedStream.append(fs.createReadStream('file1.txt'));\ncombinedStream.append(fs.createReadStream('file2.txt'));\n\ncombinedStream.pipe(fs.createWriteStream('combined.txt'));\n```\n\nHowever, what if you don't have all the source streams yet, or you don't want\nto allocate the resources (file descriptors, memory, etc.) for them right away?\nWell, in that case you can simply provide a callback that supplies the stream\nby calling a `next()` function:\n\n``` javascript\nvar CombinedStream = require('combined-stream');\nvar fs = require('fs');\n\nvar combinedStream = CombinedStream.create();\ncombinedStream.append(function(next) {\n next(fs.createReadStream('file1.txt'));\n});\ncombinedStream.append(function(next) {\n next(fs.createReadStream('file2.txt'));\n});\n\ncombinedStream.pipe(fs.createWriteStream('combined.txt'));\n```\n\n## API\n\n### CombinedStream.create([options])\n\nReturns a new combined stream object. Available options are:\n\n* `maxDataSize`\n* `pauseStreams`\n\nThe effect of those options is described below.\n\n### combinedStream.pauseStreams = `true`\n\nWhether to apply back pressure to the underlaying streams. If set to `false`,\nthe underlaying streams will never be paused. If set to `true`, the\nunderlaying streams will be paused right after being appended, as well as when\n`delayedStream.pipe()` wants to throttle.\n\n### combinedStream.maxDataSize = `2 * 1024 * 1024`\n\nThe maximum amount of bytes (or characters) to buffer for all source streams.\nIf this value is exceeded, `combinedStream` emits an `'error'` event.\n\n### combinedStream.dataSize = `0`\n\nThe amount of bytes (or characters) currently buffered by `combinedStream`.\n\n### combinedStream.append(stream)\n\nAppends the given `stream` to the combinedStream object. If `pauseStreams` is\nset to `true, this stream will also be paused right away.\n\n`streams` can also be a function that takes one parameter called `next`. `next`\nis a function that must be invoked in order to provide the `next` stream, see\nexample above.\n\nRegardless of how the `stream` is appended, combined-stream always attaches an\n`'error'` listener to it, so you don't have to do that manually.\n\nSpecial case: `stream` can also be a String or Buffer.\n\n### combinedStream.write(data)\n\nYou should not call this, `combinedStream` takes care of piping the appended\nstreams into itself for you.\n\n### combinedStream.resume()\n\nCauses `combinedStream` to start drain the streams it manages. The function is\nidempotent, and also emits a `'resume'` event each time which usually goes to\nthe stream that is currently being drained.\n\n### combinedStream.pause();\n\nIf `combinedStream.pauseStreams` is set to `false`, this does nothing.\nOtherwise a `'pause'` event is emitted, this goes to the stream that is\ncurrently being drained, so you can use it to apply back pressure.\n\n### combinedStream.end();\n\nSets `combinedStream.writable` to false, emits an `'end'` event, and removes\nall streams from the queue.\n\n### combinedStream.destroy();\n\nSame as `combinedStream.end()`, except it emits a `'close'` event instead of\n`'end'`.\n\n## License\n\ncombined-stream is licensed under the MIT license.\n",
+ "readmeFilename": "Readme.md",
+ "bugs": {
+ "url": "https://github.com/felixge/node-combined-stream/issues"
+ },
+ "_id": "combined-stream@0.0.7",
+ "_shasum": "0137e657baa5a7541c57ac37ac5fc07d73b4dc1f",
+ "_resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
+ "_from": "combined-stream@>=0.0.4 <0.1.0"
+}
diff --git a/node_modules/request/node_modules/form-data/package.json b/node_modules/request/node_modules/form-data/package.json
index 9ec7fe59e..46ec26dff 100644
--- a/node_modules/request/node_modules/form-data/package.json
+++ b/node_modules/request/node_modules/form-data/package.json
@@ -35,45 +35,14 @@
"formidable": "~1.0.14",
"request": "~2.36.0"
},
- "gitHead": "dfc1a2aef40b97807e2ffe477da06cb2c37e259f",
+ "readme": "# Form-Data [![Build Status](https://travis-ci.org/felixge/node-form-data.png?branch=master)](https://travis-ci.org/felixge/node-form-data) [![Dependency Status](https://gemnasium.com/felixge/node-form-data.png)](https://gemnasium.com/felixge/node-form-data)\n\nA module to create readable ```\"multipart/form-data\"``` streams. Can be used to submit forms and file uploads to other web applications.\n\nThe API of this module is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].\n\n[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface\n[streams2-thing]: http://nodejs.org/api/stream.html#stream_compatibility_with_older_node_versions\n\n## Install\n\n```\nnpm install form-data\n```\n\n## Usage\n\nIn this example we are constructing a form with 3 fields that contain a string,\na buffer and a file stream.\n\n``` javascript\nvar FormData = require('form-data');\nvar fs = require('fs');\n\nvar form = new FormData();\nform.append('my_field', 'my value');\nform.append('my_buffer', new Buffer(10));\nform.append('my_file', fs.createReadStream('/foo/bar.jpg'));\n```\n\nAlso you can use http-response stream:\n\n``` javascript\nvar FormData = require('form-data');\nvar http = require('http');\n\nvar form = new FormData();\n\nhttp.request('http://nodejs.org/images/logo.png', function(response) {\n form.append('my_field', 'my value');\n form.append('my_buffer', new Buffer(10));\n form.append('my_logo', response);\n});\n```\n\nOr @mikeal's request stream:\n\n``` javascript\nvar FormData = require('form-data');\nvar request = require('request');\n\nvar form = new FormData();\n\nform.append('my_field', 'my value');\nform.append('my_buffer', new Buffer(10));\nform.append('my_logo', request('http://nodejs.org/images/logo.png'));\n```\n\nIn order to submit this form to a web application, call ```submit(url, [callback])``` method:\n\n``` javascript\nform.submit('http://example.org/', function(err, res) {\n // res – response object (http.IncomingMessage) //\n res.resume(); // for node-0.10.x\n});\n\n```\n\nFor more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.\n\n### Alternative submission methods\n\nYou can use node's http client interface:\n\n``` javascript\nvar http = require('http');\n\nvar request = http.request({\n method: 'post',\n host: 'example.org',\n path: '/upload',\n headers: form.getHeaders()\n});\n\nform.pipe(request);\n\nrequest.on('response', function(res) {\n console.log(res.statusCode);\n});\n```\n\nOr if you would prefer the `'Content-Length'` header to be set for you:\n\n``` javascript\nform.submit('example.org/upload', function(err, res) {\n console.log(res.statusCode);\n});\n```\n\nTo use custom headers and pre-known length in parts:\n\n``` javascript\nvar CRLF = '\\r\\n';\nvar form = new FormData();\n\nvar options = {\n header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,\n knownLength: 1\n};\n\nform.append('my_buffer', buffer, options);\n\nform.submit('http://example.com/', function(err, res) {\n if (err) throw err;\n console.log('Done');\n});\n```\n\nForm-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide \"file\"-related information manually:\n\n``` javascript\nsomeModule.stream(function(err, stdout, stderr) {\n if (err) throw err;\n\n var form = new FormData();\n\n form.append('file', stdout, {\n filename: 'unicycle.jpg',\n contentType: 'image/jpg',\n knownLength: 19806\n });\n\n form.submit('http://example.com/', function(err, res) {\n if (err) throw err;\n console.log('Done');\n });\n});\n```\n\nFor edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:\n\n``` javascript\nform.submit({\n host: 'example.com',\n path: '/probably.php?extra=params',\n auth: 'username:password'\n}, function(err, res) {\n console.log(res.statusCode);\n});\n```\n\nIn case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:\n\n``` javascript\nform.submit({\n host: 'example.com',\n path: '/surelynot.php',\n headers: {'x-test-header': 'test-header-value'}\n}, function(err, res) {\n console.log(res.statusCode);\n});\n```\n\n## Notes\n\n- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.\n- If it feels like FormData hangs after submit and you're on ```node-0.10```, please check [Compatibility with Older Node Versions][streams2-thing]\n\n## TODO\n\n- Add new streams (0.10) support and try really hard not to break it for 0.8.x.\n\n## License\n\nForm-Data is licensed under the MIT license.\n",
+ "readmeFilename": "Readme.md",
"bugs": {
"url": "https://github.com/felixge/node-form-data/issues"
},
- "homepage": "https://github.com/felixge/node-form-data",
+ "homepage": "https://github.com/felixge/node-form-data#readme",
"_id": "form-data@0.2.0",
"_shasum": "26f8bc26da6440e299cbdcfb69035c4f77a6e466",
- "_from": "form-data@>=0.2.0 <0.3.0",
- "_npmVersion": "1.4.28",
- "_npmUser": {
- "name": "alexindigo",
- "email": "iam@alexindigo.com"
- },
- "maintainers": [
- {
- "name": "felixge",
- "email": "felix@debuggable.com"
- },
- {
- "name": "idralyuk",
- "email": "igor@buran.us"
- },
- {
- "name": "alexindigo",
- "email": "iam@alexindigo.com"
- },
- {
- "name": "mikeal",
- "email": "mikeal.rogers@gmail.com"
- },
- {
- "name": "celer",
- "email": "dtyree77@gmail.com"
- }
- ],
- "dist": {
- "shasum": "26f8bc26da6440e299cbdcfb69035c4f77a6e466",
- "tarball": "http://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz"
+ "_resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz",
+ "_from": "form-data@>=0.2.0 <0.3.0"
}
diff --git a/node_modules/request/node_modules/har-validator/README.md b/node_modules/request/node_modules/har-validator/README.md
index 2bfb624a3..4e580ab86 100644
--- a/node_modules/request/node_modules/har-validator/README.md
+++ b/node_modules/request/node_modules/har-validator/README.md
@@ -176,7 +176,7 @@ validate.creator(data, function (e, valid) {
Returns `true` or `false`.
- **data**: `Object` *(Required)*
- a [entry](http://www.softwareishard.com/blog/har-12-spec/#entries) object
+ an [entry](http://www.softwareishard.com/blog/har-12-spec/#entries) object
- **callback**: `Function`
gets two arguments (err, valid)
@@ -319,6 +319,15 @@ validate.timings(data, function (e, valid) {
});
```
+## Support
+
+Donations are welcome to help support the continuous development of this project.
+
+[![Gratipay][gratipay-image]][gratipay-url]
+[![PayPal][paypal-image]][paypal-url]
+[![Flattr][flattr-image]][flattr-url]
+[![Bitcoin][bitcoin-image]][bitcoin-url]
+
## License
[MIT](LICENSE) &copy; [Ahmad Nassri](https://www.ahmadnassri.com)
@@ -339,3 +348,15 @@ validate.timings(data, function (e, valid) {
[david-url]: https://david-dm.org/ahmadnassri/har-validator
[david-image]: https://img.shields.io/david/ahmadnassri/har-validator.svg?style=flat-square
+
+[gratipay-url]: https://www.gratipay.com/ahmadnassri/
+[gratipay-image]: https://img.shields.io/gratipay/ahmadnassri.svg?style=flat-square
+
+[paypal-url]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UJ2B2BTK9VLRS&on0=project&os0=har-validator
+[paypal-image]: http://img.shields.io/badge/paypal-donate-green.svg?style=flat-square
+
+[flattr-url]: https://flattr.com/submit/auto?user_id=ahmadnassri&url=https://github.com/ahmadnassri/har-validator&title=har-validator&language=&tags=github&category=software
+[flattr-image]: http://img.shields.io/badge/flattr-donate-green.svg?style=flat-square
+
+[bitcoin-image]: http://img.shields.io/badge/bitcoin-1Nb46sZRVG3or7pNaDjthcGJpWhvoPpCxy-green.svg?style=flat-square
+[bitcoin-url]: https://www.coinbase.com/checkouts/ae383ae6bb931a2fa5ad11cec115191e?name=har-validator
diff --git a/node_modules/request/node_modules/har-validator/node_modules/bluebird/changelog.md b/node_modules/request/node_modules/har-validator/node_modules/bluebird/changelog.md
index 1f506bb19..46729e1ee 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/bluebird/changelog.md
+++ b/node_modules/request/node_modules/har-validator/node_modules/bluebird/changelog.md
@@ -1,3 +1,16 @@
+## 2.9.26 (2015-05-25)
+
+Bugfixes:
+
+ - Fix crash in NW [#624](.)
+ - Fix [`.return()`](.) not supporting `undefined` as return value [#627](.)
+
+## 2.9.25 (2015-04-28)
+
+Bugfixes:
+
+ - Fix crash in node 0.8
+
## 2.9.24 (2015-04-02)
Bugfixes:
diff --git a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.js b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.js
index c42fe2990..69a6ffd87 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.js
@@ -23,7 +23,7 @@
*
*/
/**
- * bluebird build version 2.9.24
+ * bluebird build version 2.9.26
* Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, cancel, using, filter, any, each, timers
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
@@ -111,6 +111,7 @@ Async.prototype.throwLater = function(fn, arg) {
Async.prototype._getDomain = function() {};
+if (!true) {
if (util.isNode) {
var EventsModule = _dereq_("events");
@@ -126,31 +127,32 @@ if (util.isNode) {
var descriptor =
Object.getOwnPropertyDescriptor(EventsModule, "usingDomains");
- if (!descriptor.configurable) {
- process.on("domainsActivated", function() {
- Async.prototype._getDomain = domainGetter;
- });
- } else {
- var usingDomains = false;
- Object.defineProperty(EventsModule, "usingDomains", {
- configurable: false,
- enumerable: true,
- get: function() {
- return usingDomains;
- },
- set: function(value) {
- if (usingDomains || !value) return;
- usingDomains = true;
+ if (descriptor) {
+ if (!descriptor.configurable) {
+ process.on("domainsActivated", function() {
Async.prototype._getDomain = domainGetter;
- util.toFastProperties(process);
- process.emit("domainsActivated");
- }
- });
+ });
+ } else {
+ var usingDomains = false;
+ Object.defineProperty(EventsModule, "usingDomains", {
+ configurable: false,
+ enumerable: true,
+ get: function() {
+ return usingDomains;
+ },
+ set: function(value) {
+ if (usingDomains || !value) return;
+ usingDomains = true;
+ Async.prototype._getDomain = domainGetter;
+ util.toFastProperties(process);
+ process.emit("domainsActivated");
+ }
+ });
+ }
}
-
-
}
}
+}
function AsyncInvokeLater(fn, receiver, arg) {
var domain = this._getDomain();
@@ -1280,6 +1282,10 @@ var returner = function () {
var thrower = function () {
throw this;
};
+var returnUndefined = function() {};
+var throwUndefined = function() {
+ throw undefined;
+};
var wrapper = function (value, action) {
if (action === 1) {
@@ -1296,6 +1302,8 @@ var wrapper = function (value, action) {
Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
+ if (value === undefined) return this.then(returnUndefined);
+
if (wrapsPrimitiveReceiver && isPrimitive(value)) {
return this._then(
wrapper(value, 2),
@@ -1310,6 +1318,8 @@ Promise.prototype.thenReturn = function (value) {
Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
+ if (reason === undefined) return this.then(throwUndefined);
+
if (wrapsPrimitiveReceiver && isPrimitive(reason)) {
return this._then(
wrapper(reason, 1),
@@ -3854,7 +3864,7 @@ var noAsyncScheduler = function() {
if (_dereq_("./util.js").isNode) {
var version = process.versions.node.split(".").map(Number);
schedule = (version[0] === 0 && version[1] > 10) || (version[0] > 0)
- ? global.setImmediate : process.nextTick;
+ ? function(fn) { global.setImmediate(fn); } : process.nextTick;
if (!schedule) {
if (typeof setImmediate !== "undefined") {
diff --git a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.min.js b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.min.js
index bee550ccc..679f77804 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.min.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.min.js
@@ -23,9 +23,9 @@
*
*/
/**
- * bluebird build version 2.9.24
+ * bluebird build version 2.9.26
* Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, cancel, using, filter, any, each, timers
*/
-!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,r;return function n(t,e,r){function i(s,a){if(!e[s]){if(!t[s]){var u="function"==typeof _dereq_&&_dereq_;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var r=t[s][1][e];return i(r?r:e)},l,l.exports,n,t,e,r)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s<r.length;s++)i(r[s]);return i}({1:[function(t,e){"use strict";e.exports=function(t){function e(t){var e=new r(t),n=e.promise();return e.setHowMany(1),e.setUnwrap(),e.init(),n}var r=t._SomePromiseArray;t.any=function(t){return e(t)},t.prototype.any=function(){return e(this)}}},{}],2:[function(t,e){"use strict";function r(){this._isTickUsed=!1,this._lateQueue=new c(16),this._normalQueue=new c(16),this._trampolineEnabled=!0;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=u.isStatic?u(this.drainQueues):u}function n(t,e,r){var n=this._getDomain();void 0!==n&&(t=n.bind(t)),this._lateQueue.push(t,e,r),this._queueTick()}function i(t,e,r){var n=this._getDomain();void 0!==n&&(t=n.bind(t)),this._normalQueue.push(t,e,r),this._queueTick()}function o(t){var e=this._getDomain();if(void 0!==e){var r=e.bind(t._settlePromises);this._normalQueue.push(r,t,void 0)}else this._normalQueue._pushOne(t);this._queueTick()}var s;try{throw new Error}catch(a){s=a}var u=t("./schedule.js"),c=t("./queue.js"),l=t("./util.js");if(r.prototype.disableTrampolineIfNecessary=function(){l.hasDevTools&&(this._trampolineEnabled=!1)},r.prototype.enableTrampoline=function(){this._trampolineEnabled||(this._trampolineEnabled=!0,this._schedule=function(t){setTimeout(t,0)})},r.prototype.haveItemsQueued=function(){return this._normalQueue.length()>0},r.prototype.throwLater=function(t,e){1===arguments.length&&(e=t,t=function(){throw e});var r=this._getDomain();if(void 0!==r&&(t=r.bind(t)),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/m3OTXk\n")}},r.prototype._getDomain=function(){},l.isNode){var h=t("events"),p=function(){var t=process.domain;return null===t?void 0:t};if(h.usingDomains)r.prototype._getDomain=p;else{var f=Object.getOwnPropertyDescriptor(h,"usingDomains");if(f.configurable){var _=!1;Object.defineProperty(h,"usingDomains",{configurable:!1,enumerable:!0,get:function(){return _},set:function(t){!_&&t&&(_=!0,r.prototype._getDomain=p,l.toFastProperties(process),process.emit("domainsActivated"))}})}else process.on("domainsActivated",function(){r.prototype._getDomain=p})}}l.hasDevTools?(r.prototype.invokeLater=function(t,e,r){this._trampolineEnabled?n.call(this,t,e,r):setTimeout(function(){t.call(e,r)},100)},r.prototype.invoke=function(t,e,r){this._trampolineEnabled?i.call(this,t,e,r):setTimeout(function(){t.call(e,r)},0)},r.prototype.settlePromises=function(t){this._trampolineEnabled?o.call(this,t):setTimeout(function(){t._settlePromises()},0)}):(r.prototype.invokeLater=n,r.prototype.invoke=i,r.prototype.settlePromises=o),r.prototype.invokeFirst=function(t,e,r){var n=this._getDomain();void 0!==n&&(t=n.bind(t)),this._normalQueue.unshift(t,e,r),this._queueTick()},r.prototype._drainQueue=function(t){for(;t.length()>0;){var e=t.shift();if("function"==typeof e){var r=t.shift(),n=t.shift();e.call(r,n)}else e._settlePromises()}},r.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._drainQueue(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=new r,e.exports.firstLineError=s},{"./queue.js":28,"./schedule.js":31,"./util.js":38,events:39}],3:[function(t,e){"use strict";e.exports=function(t,e,r){var n=function(t,e){this._reject(e)},i=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(n,n,null,this,t)},o=function(t,e){this._setBoundTo(t),this._isPending()&&this._resolveCallback(e.target)},s=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(n){var a=r(n),u=new t(e);u._propagateFrom(this,1);var c=this._target();if(a instanceof t){var l={promiseRejectionQueued:!1,promise:u,target:c,bindingPromise:a};c._then(e,i,u._progress,u,l),a._then(o,s,u._progress,u,l)}else u._setBoundTo(n),u._resolveCallback(c);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=131072|this._bitField,this._boundTo=t):this._bitField=-131073&this._bitField},t.prototype._isBound=function(){return 131072===(131072&this._bitField)},t.bind=function(n,i){var o=r(n),s=new t(e);return o instanceof t?o._then(function(t){s._setBoundTo(t),s._resolveCallback(i)},s._reject,s._progress,s,null):(s._setBoundTo(n),s._resolveCallback(i)),s}}},{}],4:[function(t,e){"use strict";function r(){try{Promise===i&&(Promise=n)}catch(t){}return i}var n;"undefined"!=typeof Promise&&(n=Promise);var i=t("./promise.js")();i.noConflict=r,e.exports=i},{"./promise.js":23}],5:[function(t,e){"use strict";var r=Object.create;if(r){var n=r(null),i=r(null);n[" size"]=i[" size"]=0}e.exports=function(e){function r(t,r){var n;if(null!=t&&(n=t[r]),"function"!=typeof n){var i="Object "+a.classString(t)+" has no method '"+a.toString(r)+"'";throw new e.TypeError(i)}return n}function n(t){var e=this.pop(),n=r(t,e);return n.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}{var s,a=t("./util.js"),u=a.canEvaluate;a.isIdentifier}e.prototype.call=function(t){for(var e=arguments.length,r=new Array(e-1),i=1;e>i;++i)r[i-1]=arguments[i];return r.push(t),this._then(n,void 0,void 0,r,void 0)},e.prototype.get=function(t){var e,r="number"==typeof t;if(r)e=o;else if(u){var n=s(t);e=null!==n?n:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util.js":38}],6:[function(t,e){"use strict";e.exports=function(e){var r=t("./errors.js"),n=t("./async.js"),i=r.CancellationError;e.prototype._cancel=function(t){if(!this.isCancellable())return this;for(var e,r=this;void 0!==(e=r._cancellationParent)&&e.isCancellable();)r=e;this._unsetCancellable(),r._target()._rejectCallback(t,!1,!0)},e.prototype.cancel=function(t){return this.isCancellable()?(void 0===t&&(t=new i),n.invokeLater(this._cancel,this,t),this):this},e.prototype.cancellable=function(){return this._cancellable()?this:(n.enableTrampoline(),this._setCancellable(),this._cancellationParent=void 0,this)},e.prototype.uncancellable=function(){var t=this.then();return t._unsetCancellable(),t},e.prototype.fork=function(t,e,r){var n=this._then(t,e,r,void 0,void 0);return n._setCancellable(),n._cancellationParent=void 0,n}}},{"./async.js":2,"./errors.js":13}],7:[function(t,e){"use strict";e.exports=function(){function e(t){this._parent=t;var r=this._length=1+(void 0===t?0:t._length);j(this,e),r>32&&this.uncycle()}function r(t,e){for(var r=0;r<e.length-1;++r)e[r].push("From previous event:"),e[r]=e[r].join("\n");return r<e.length&&(e[r]=e[r].join("\n")),t+"\n"+e.join("\n")}function n(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function i(t){for(var e=t[0],r=1;r<t.length;++r){for(var n=t[r],i=e.length-1,o=e[i],s=-1,a=n.length-1;a>=0;--a)if(n[a]===o){s=a;break}for(var a=s;a>=0;--a){var u=n[a];if(e[i]!==u)break;e.pop(),i--}e=n}}function o(t){for(var e=[],r=0;r<t.length;++r){var n=t[r],i=_.test(n)||" (No stack trace)"===n,o=i&&y(n);i&&!o&&(v&&" "!==n.charAt(0)&&(n=" "+n),e.push(n))}return e}function s(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),r=0;r<e.length;++r){var n=e[r];if(" (No stack trace)"===n||_.test(n))break}return r>0&&(e=e.slice(r)),e}function a(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t.toString();var r=/\[object [a-zA-Z0-9$_]+\]/;if(r.test(e))try{var n=JSON.stringify(t);e=n}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+u(e)+">, no stack trace)"}function u(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function c(t){var e=t.match(g);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}var l,h=t("./async.js"),p=t("./util.js"),f=/[\\\/]bluebird[\\\/]js[\\\/](main|debug|zalgo|instrumented)/,_=null,d=null,v=!1;p.inherits(e,Error),e.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],r={},n=0,i=this;void 0!==i;++n)e.push(i),i=i._parent;t=this._length=n;for(var n=t-1;n>=0;--n){var o=e[n].stack;void 0===r[o]&&(r[o]=n)}for(var n=0;t>n;++n){var s=e[n].stack,a=r[s];if(void 0!==a&&a!==n){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[n]._parent=void 0,e[n]._length=1;var u=n>0?e[n-1]:this;t-1>a?(u._parent=e[a+1],u._parent.uncycle(),u._length=u._parent._length+1):(u._parent=void 0,u._length=1);for(var c=u._length+1,l=n-2;l>=0;--l)e[l]._length=c,c++;return}}}},e.prototype.parent=function(){return this._parent},e.prototype.hasParent=function(){return void 0!==this._parent},e.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var s=e.parseStackAndMessage(t),a=s.message,u=[s.stack],c=this;void 0!==c;)u.push(o(c.stack.split("\n"))),c=c._parent;i(u),n(u),p.notEnumerableProp(t,"stack",r(a,u)),p.notEnumerableProp(t,"__stackCleaned__",!0)}},e.parseStackAndMessage=function(t){var e=t.stack,r=t.toString();return e="string"==typeof e&&e.length>0?s(t):[" (No stack trace)"],{message:r,stack:o(e)}},e.formatAndLogError=function(t,e){if("undefined"!=typeof console){var r;if("object"==typeof t||"function"==typeof t){var n=t.stack;r=e+d(n,t)}else r=e+String(t);"function"==typeof l?l(r):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}},e.unhandledRejection=function(t){e.formatAndLogError(t,"^--- With additional stack trace: ")},e.isSupported=function(){return"function"==typeof j},e.fireRejectionEvent=function(t,r,n,i){var o=!1;try{"function"==typeof r&&(o=!0,"rejectionHandled"===t?r(i):r(n,i))}catch(s){h.throwLater(s)}var a=!1;try{a=b(t,n,i)}catch(s){a=!0,h.throwLater(s)}var u=!1;if(m)try{u=m(t.toLowerCase(),{reason:n,promise:i})}catch(s){u=!0,h.throwLater(s)}a||o||u||"unhandledRejection"!==t||e.formatAndLogError(n,"Unhandled rejection ")};var y=function(){return!1},g=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;e.setBounds=function(t,r){if(e.isSupported()){for(var n,i,o=t.stack.split("\n"),s=r.stack.split("\n"),a=-1,u=-1,l=0;l<o.length;++l){var h=c(o[l]);if(h){n=h.fileName,a=h.line;break}}for(var l=0;l<s.length;++l){var h=c(s[l]);if(h){i=h.fileName,u=h.line;break}}0>a||0>u||!n||!i||n!==i||a>=u||(y=function(t){if(f.test(t))return!0;var e=c(t);return e&&e.fileName===n&&a<=e.line&&e.line<=u?!0:!1})}};var m,j=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():a(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit=Error.stackTraceLimit+6,_=t,d=e;var r=Error.captureStackTrace;return y=function(t){return f.test(t)},function(t,e){Error.stackTraceLimit=Error.stackTraceLimit+6,r(t,e),Error.stackTraceLimit=Error.stackTraceLimit-6}}var n=new Error;if("string"==typeof n.stack&&n.stack.split("\n")[0].indexOf("stackDetection@")>=0)return _=/@/,d=e,v=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in n||!i?(d=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?a(e):e.toString()},null):(_=t,d=e,function(t){Error.stackTraceLimit=Error.stackTraceLimit+6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit=Error.stackTraceLimit-6})}([]),b=function(){if(p.isNode)return function(t,e,r){return"rejectionHandled"===t?process.emit(t,r):process.emit(t,e,r)};var t=!1,e=!0;try{var r=new self.CustomEvent("test");t=r instanceof CustomEvent}catch(n){}if(!t)try{var i=document.createEvent("CustomEvent");i.initCustomEvent("testingtheevent",!1,!0,{}),self.dispatchEvent(i)}catch(n){e=!1}e&&(m=function(e,r){var n;return t?n=new self.CustomEvent(e,{detail:r,bubbles:!1,cancelable:!0}):self.dispatchEvent&&(n=document.createEvent("CustomEvent"),n.initCustomEvent(e,!1,!0,r)),n?!self.dispatchEvent(n):!1});var o={};return o.unhandledRejection="onunhandledRejection".toLowerCase(),o.rejectionHandled="onrejectionHandled".toLowerCase(),function(t,e,r){var n=o[t],i=self[n];return i?("rejectionHandled"===t?i.call(self,r):i.call(self,e,r),!0):!1}}();return"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(l=function(t){console.warn(t)},p.isNode&&process.stderr.isTTY?l=function(t){process.stderr.write(""+t+"\n")}:p.isNode||"string"!=typeof(new Error).stack||(l=function(t){console.warn("%c"+t,"color: red")})),e}},{"./async.js":2,"./util.js":38}],8:[function(t,e){"use strict";e.exports=function(e){function r(t,e,r){this._instances=t,this._callback=e,this._promise=r}function n(t,e){var r={},n=s(t).call(r,e);if(n===a)return n;var i=u(r);return i.length?(a.e=new c("Catch filter must inherit from Error or be a simple predicate function\n\n See http://goo.gl/o84o68\n"),a):n}var i=t("./util.js"),o=t("./errors.js"),s=i.tryCatch,a=i.errorObj,u=t("./es5.js").keys,c=o.TypeError;return r.prototype.doFilter=function(t){for(var r=this._callback,i=this._promise,o=i._boundTo,u=0,c=this._instances.length;c>u;++u){var l=this._instances[u],h=l===Error||null!=l&&l.prototype instanceof Error;if(h&&t instanceof l){var p=s(r).call(o,t);return p===a?(e.e=p.e,e):p}if("function"==typeof l&&!h){var f=n(l,t);if(f===a){t=a.e;break}if(f){var p=s(r).call(o,t);return p===a?(e.e=p.e,e):p}}}return e.e=t,e},r}},{"./errors.js":13,"./es5.js":14,"./util.js":38}],9:[function(t,e){"use strict";e.exports=function(t,e,r){function n(){this._trace=new e(o())}function i(){return r()?new n:void 0}function o(){var t=s.length-1;return t>=0?s[t]:void 0}var s=[];return n.prototype._pushContext=function(){r()&&void 0!==this._trace&&s.push(this._trace)},n.prototype._popContext=function(){r()&&void 0!==this._trace&&s.pop()},t.prototype._peekContext=o,t.prototype._pushContext=n.prototype._pushContext,t.prototype._popContext=n.prototype._popContext,i}},{}],10:[function(t,e){"use strict";e.exports=function(e,r){var n,i,o=t("./async.js"),s=t("./errors.js").Warning,a=t("./util.js"),u=a.canAttachTrace,c=!1||a.isNode&&(!!process.env.BLUEBIRD_DEBUG||"development"===process.env.NODE_ENV);return c&&o.disableTrampolineIfNecessary(),e.prototype._ensurePossibleRejectionHandled=function(){this._setRejectionIsUnhandled(),o.invokeLater(this._notifyUnhandledRejection,this,void 0)},e.prototype._notifyUnhandledRejectionIsHandled=function(){r.fireRejectionEvent("rejectionHandled",n,void 0,this)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._getCarriedStackTrace()||this._settledValue;this._setUnhandledRejectionIsNotified(),r.fireRejectionEvent("unhandledRejection",i,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=524288|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-524289&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(524288&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=2097152|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-2097153&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(2097152&this._bitField)>0},e.prototype._setCarriedStackTrace=function(t){this._bitField=1048576|this._bitField,this._fulfillmentHandler0=t},e.prototype._isCarryingStackTrace=function(){return(1048576&this._bitField)>0},e.prototype._getCarriedStackTrace=function(){return this._isCarryingStackTrace()?this._fulfillmentHandler0:void 0},e.prototype._captureStackTrace=function(){return c&&(this._trace=new r(this._peekContext())),this},e.prototype._attachExtraTrace=function(t,e){if(c&&u(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var i=r.parseStackAndMessage(t);a.notEnumerableProp(t,"stack",i.message+"\n"+i.stack.join("\n")),a.notEnumerableProp(t,"__stackCleaned__",!0)}}},e.prototype._warn=function(t){var e=new s(t),n=this._peekContext();if(n)n.attachExtraTrace(e);else{var i=r.parseStackAndMessage(e);e.stack=i.message+"\n"+i.stack.join("\n")}r.formatAndLogError(e,"")},e.onPossiblyUnhandledRejection=function(t){i="function"==typeof t?t:void 0},e.onUnhandledRejectionHandled=function(t){n="function"==typeof t?t:void 0},e.longStackTraces=function(){if(o.haveItemsQueued()&&c===!1)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/DT1qyG\n");c=r.isSupported(),c&&o.disableTrampolineIfNecessary()},e.hasLongStackTraces=function(){return c&&r.isSupported()},r.isSupported()||(e.longStackTraces=function(){},c=!1),function(){return c}}},{"./async.js":2,"./errors.js":13,"./util.js":38}],11:[function(t,e){"use strict";var r=t("./util.js"),n=r.isPrimitive,i=r.wrapsPrimitiveReceiver;e.exports=function(t){var e=function(){return this},r=function(){throw this},o=function(t,e){return 1===e?function(){throw t}:2===e?function(){return t}:void 0};t.prototype["return"]=t.prototype.thenReturn=function(t){return i&&n(t)?this._then(o(t,2),void 0,void 0,void 0,void 0):this._then(e,void 0,void 0,t,void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return i&&n(t)?this._then(o(t,1),void 0,void 0,void 0,void 0):this._then(r,void 0,void 0,t,void 0)}}},{"./util.js":38}],12:[function(t,e){"use strict";e.exports=function(t,e){var r=t.reduce;t.prototype.each=function(t){return r(this,t,null,e)},t.each=function(t,n){return r(t,n,null,e)}}},{}],13:[function(t,e){"use strict";function r(t,e){function r(n){return this instanceof r?(l(this,"message","string"==typeof n?n:e),l(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new r(n)}return c(r,Error),r}function n(t){return this instanceof n?(l(this,"name","OperationalError"),l(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(l(this,"message",t.message),l(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new n(t)}var i,o,s=t("./es5.js"),a=s.freeze,u=t("./util.js"),c=u.inherits,l=u.notEnumerableProp,h=r("Warning","warning"),p=r("CancellationError","cancellation error"),f=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,o=RangeError}catch(d){i=r("TypeError","type error"),o=r("RangeError","range error")}for(var v="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),y=0;y<v.length;++y)"function"==typeof Array.prototype[v[y]]&&(_.prototype[v[y]]=Array.prototype[v[y]]);s.defineProperty(_.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),_.prototype.isOperational=!0;var g=0;_.prototype.toString=function(){var t=Array(4*g+1).join(" "),e="\n"+t+"AggregateError of:\n";g++,t=Array(4*g+1).join(" ");for(var r=0;r<this.length;++r){for(var n=this[r]===this?"[Circular AggregateError]":this[r]+"",i=n.split("\n"),o=0;o<i.length;++o)i[o]=t+i[o];n=i.join("\n"),e+=n+"\n"}return g--,e},c(n,Error);var m=Error.__BluebirdErrorTypes__;m||(m=a({CancellationError:p,TimeoutError:f,OperationalError:n,RejectionError:n,AggregateError:_}),l(Error,"__BluebirdErrorTypes__",m)),e.exports={Error:Error,TypeError:i,RangeError:o,CancellationError:m.CancellationError,OperationalError:m.OperationalError,TimeoutError:m.TimeoutError,AggregateError:m.AggregateError,Warning:h}},{"./es5.js":14,"./util.js":38}],14:[function(t,e){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var r=Object.getOwnPropertyDescriptor(t,e);return!(r&&!r.writable&&!r.set)}};else{var n={}.hasOwnProperty,i={}.toString,o={}.constructor.prototype,s=function(t){var e=[];for(var r in t)n.call(t,r)&&e.push(r);return e},a=function(t,e){return{value:t[e]}},u=function(t,e,r){return t[e]=r.value,t},c=function(t){return t},l=function(t){try{return Object(t).constructor.prototype}catch(e){return o}},h=function(t){try{return"[object Array]"===i.call(t)}catch(e){return!1}};e.exports={isArray:h,keys:s,names:s,defineProperty:u,getDescriptor:a,freeze:c,getPrototypeOf:l,isES5:r,propertyIsWritable:function(){return!0}}}},{}],15:[function(t,e){"use strict";e.exports=function(t,e){var r=t.map;t.prototype.filter=function(t,n){return r(this,t,n,e)},t.filter=function(t,n,i){return r(t,n,i,e)}}},{}],16:[function(t,e){"use strict";e.exports=function(e,r,n){function i(){return this}function o(){throw this}function s(t){return function(){return t}}function a(t){return function(){throw t}}function u(t,e,r){var n;return n=p&&f(e)?r?s(e):a(e):r?i:o,t._then(n,_,void 0,e,void 0)}function c(t){var i=this.promise,o=this.handler,s=i._isBound()?o.call(i._boundTo):o();if(void 0!==s){var a=n(s,i);if(a instanceof e)return a=a._target(),u(a,t,i.isFulfilled())}return i.isRejected()?(r.e=t,r):t}function l(t){var r=this.promise,i=this.handler,o=r._isBound()?i.call(r._boundTo,t):i(t);if(void 0!==o){var s=n(o,r);if(s instanceof e)return s=s._target(),u(s,t,!0)}return t}var h=t("./util.js"),p=h.wrapsPrimitiveReceiver,f=h.isPrimitive,_=h.thrower;e.prototype._passThroughHandler=function(t,e){if("function"!=typeof t)return this.then();var r={promise:this,handler:t};return this._then(e?c:l,e?c:void 0,void 0,r,void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThroughHandler(t,!0)},e.prototype.tap=function(t){return this._passThroughHandler(t,!1)}}},{"./util.js":38}],17:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t,r,n){for(var o=0;o<r.length;++o){n._pushContext();var s=h(r[o])(t);if(n._popContext(),s===l){n._pushContext();var a=e.reject(l.e);return n._popContext(),a}var u=i(s,n);if(u instanceof e)return u}return null}function s(t,r,i,o){var s=this._promise=new e(n);s._captureStackTrace(),this._stack=o,this._generatorFunction=t,this._receiver=r,this._generator=void 0,this._yieldHandlers="function"==typeof i?[i].concat(p):p}var a=t("./errors.js"),u=a.TypeError,c=t("./util.js"),l=c.errorObj,h=c.tryCatch,p=[];s.prototype.promise=function(){return this._promise},s.prototype._run=function(){this._generator=this._generatorFunction.call(this._receiver),this._receiver=this._generatorFunction=void 0,this._next(void 0)},s.prototype._continue=function(t){if(t===l)return this._promise._rejectCallback(t.e,!1,!0);var r=t.value;if(t.done===!0)this._promise._resolveCallback(r);else{var n=i(r,this._promise);if(!(n instanceof e)&&(n=o(n,this._yieldHandlers,this._promise),null===n))return void this._throw(new u("A value %s was yielded that could not be treated as a promise\n\n See http://goo.gl/4Y4pDk\n\n".replace("%s",r)+"From coroutine:\n"+this._stack.split("\n").slice(1,-7).join("\n")));n._then(this._next,this._throw,void 0,this,null)}},s.prototype._throw=function(t){this._promise._attachExtraTrace(t),this._promise._pushContext();var e=h(this._generator["throw"]).call(this._generator,t);this._promise._popContext(),this._continue(e)},s.prototype._next=function(t){this._promise._pushContext();var e=h(this._generator.next).call(this._generator,t);this._promise._popContext(),this._continue(e)},e.coroutine=function(t,e){if("function"!=typeof t)throw new u("generatorFunction must be a function\n\n See http://goo.gl/6Vqhm0\n");var r=Object(e).yieldHandler,n=s,i=(new Error).stack;return function(){var e=t.apply(this,arguments),o=new n(void 0,void 0,r,i);return o._generator=e,o._next(void 0),o.promise()}},e.coroutine.addYieldHandler=function(t){if("function"!=typeof t)throw new u("fn must be a function\n\n See http://goo.gl/916lJJ\n");p.push(t)},e.spawn=function(t){if("function"!=typeof t)return r("generatorFunction must be a function\n\n See http://goo.gl/6Vqhm0\n");var n=new s(t,this),i=n.promise();return n._run(e.spawn),i}}},{"./errors.js":13,"./util.js":38}],18:[function(t,e){"use strict";e.exports=function(e,r,n,i){{var o=t("./util.js");o.canEvaluate,o.tryCatch,o.errorObj}e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var n}for(var i=arguments.length,o=new Array(i),s=0;i>s;++s)o[s]=arguments[s];t&&o.pop();var n=new r(o).promise();return void 0!==t?n.spread(t):n}}},{"./util.js":38}],19:[function(t,e){"use strict";e.exports=function(e,r,n,i,o){function s(t,e,r,n){this.constructor$(t),this._promise._captureStackTrace(),this._callback=e,this._preservedValues=n===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=r>=1?[]:_,c.invoke(a,this,void 0)}function a(){this._init$(void 0,-2)}function u(t,e,r,n){var i="object"==typeof r&&null!==r?r.concurrency:0;return i="number"==typeof i&&isFinite(i)&&i>=1?i:0,new s(t,e,i,n)}var c=t("./async.js"),l=t("./util.js"),h=l.tryCatch,p=l.errorObj,f={},_=[];l.inherits(s,r),s.prototype._init=function(){},s.prototype._promiseFulfilled=function(t,r){var n=this._values,o=this.length(),s=this._preservedValues,a=this._limit;if(n[r]===f){if(n[r]=t,a>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return}else{if(a>=1&&this._inFlight>=a)return n[r]=t,void this._queue.push(r);null!==s&&(s[r]=t);var u=this._callback,c=this._promise._boundTo;this._promise._pushContext();var l=h(u).call(c,t,r,o);if(this._promise._popContext(),l===p)return this._reject(l.e);var _=i(l,this._promise);if(_ instanceof e){if(_=_._target(),_._isPending())return a>=1&&this._inFlight++,n[r]=f,_._proxyPromiseArray(this,r);if(!_._isFulfilled())return this._reject(_._reason());l=_._value()}n[r]=l}var d=++this._totalResolved;d>=o&&(null!==s?this._filter(n,s):this._resolve(n))},s.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,r=this._values;t.length>0&&this._inFlight<e;){if(this._isResolved())return;var n=t.pop();this._promiseFulfilled(r[n],n)}},s.prototype._filter=function(t,e){for(var r=e.length,n=new Array(r),i=0,o=0;r>o;++o)t[o]&&(n[i++]=e[o]);n.length=i,this._resolve(n)},s.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return"function"!=typeof t?n("fn must be a function\n\n See http://goo.gl/916lJJ\n"):u(this,t,e,null).promise()},e.map=function(t,e,r,i){return"function"!=typeof e?n("fn must be a function\n\n See http://goo.gl/916lJJ\n"):u(t,e,r,i).promise()}}},{"./async.js":2,"./util.js":38}],20:[function(t,e){"use strict";e.exports=function(e,r,n,i){var o=t("./util.js"),s=o.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("fn must be a function\n\n See http://goo.gl/916lJJ\n");return function(){var n=new e(r);n._captureStackTrace(),n._pushContext();var i=s(t).apply(this,arguments);return n._popContext(),n._resolveFromSyncValue(i),n}},e.attempt=e["try"]=function(t,n,a){if("function"!=typeof t)return i("fn must be a function\n\n See http://goo.gl/916lJJ\n");var u=new e(r);u._captureStackTrace(),u._pushContext();var c=o.isArray(n)?s(t).apply(a,n):s(t).call(a,n);return u._popContext(),u._resolveFromSyncValue(c),u},e.prototype._resolveFromSyncValue=function(t){t===o.errorObj?this._rejectCallback(t.e,!1,!0):this._resolveCallback(t,!0)}}},{"./util.js":38}],21:[function(t,e){"use strict";e.exports=function(e){function r(t,e){var r=this;if(!o.isArray(t))return n.call(r,t,e);var i=a(e).apply(r._boundTo,[null].concat(t));i===u&&s.throwLater(i.e)}function n(t,e){var r=this,n=r._boundTo,i=void 0===t?a(e).call(n,null):a(e).call(n,null,t);i===u&&s.throwLater(i.e)}function i(t,e){var r=this;if(!t){var n=r._target(),i=n._getCarriedStackTrace();i.cause=t,t=i}var o=a(e).call(r._boundTo,t);o===u&&s.throwLater(o.e)}var o=t("./util.js"),s=t("./async.js"),a=o.tryCatch,u=o.errorObj;e.prototype.asCallback=e.prototype.nodeify=function(t,e){if("function"==typeof t){var o=n;void 0!==e&&Object(e).spread&&(o=r),this._then(o,i,void 0,this,t)}return this}}},{"./async.js":2,"./util.js":38}],22:[function(t,e){"use strict";e.exports=function(e,r){var n=t("./util.js"),i=t("./async.js"),o=n.tryCatch,s=n.errorObj;e.prototype.progressed=function(t){return this._then(void 0,void 0,t,void 0,void 0)},e.prototype._progress=function(t){this._isFollowingOrFulfilledOrRejected()||this._target()._progressUnchecked(t)},e.prototype._progressHandlerAt=function(t){return 0===t?this._progressHandler0:this[(t<<2)+t-5+2]},e.prototype._doProgressWith=function(t){var r=t.value,i=t.handler,a=t.promise,u=t.receiver,c=o(i).call(u,r);if(c===s){if(null!=c.e&&"StopProgressPropagation"!==c.e.name){var l=n.canAttachTrace(c.e)?c.e:new Error(n.toString(c.e));a._attachExtraTrace(l),a._progress(c.e)}}else c instanceof e?c._then(a._progress,null,null,a,void 0):a._progress(c)},e.prototype._progressUnchecked=function(t){for(var n=this._length(),o=this._progress,s=0;n>s;s++){var a=this._progressHandlerAt(s),u=this._promiseAt(s);if(u instanceof e)"function"==typeof a?i.invoke(this._doProgressWith,this,{handler:a,promise:u,receiver:this._receiverAt(s),value:t}):i.invoke(o,u,t);else{var c=this._receiverAt(s);"function"==typeof a?a.call(c,t,u):c instanceof r&&!c._isResolved()&&c._promiseProgressed(t,u)}}}}},{"./async.js":2,"./util.js":38}],23:[function(t,e){"use strict";e.exports=function(){function e(t){if("function"!=typeof t)throw new c("the promise constructor requires a resolver function\n\n See http://goo.gl/EC22Yn\n");if(this.constructor!==e)throw new c("the promise constructor cannot be invoked directly\n\n See http://goo.gl/KsIlge\n");this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._progressHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._settledValue=void 0,t!==l&&this._resolveFromResolver(t)}function r(t){var r=new e(l);r._fulfillmentHandler0=t,r._rejectionHandler0=t,r._progressHandler0=t,r._promise0=t,r._receiver0=t,r._settledValue=t}var n=function(){return new c("circular promise resolution chain\n\n See http://goo.gl/LhFpo0\n")},i=function(){return new e.PromiseInspection(this._target())},o=function(t){return e.reject(new c(t))},s=t("./util.js"),a=t("./async.js"),u=t("./errors.js"),c=e.TypeError=u.TypeError;e.RangeError=u.RangeError,e.CancellationError=u.CancellationError,e.TimeoutError=u.TimeoutError,e.OperationalError=u.OperationalError,e.RejectionError=u.OperationalError,e.AggregateError=u.AggregateError;var l=function(){},h={},p={e:null},f=t("./thenables.js")(e,l),_=t("./promise_array.js")(e,l,f,o),d=t("./captured_trace.js")(),v=t("./debuggability.js")(e,d),y=t("./context.js")(e,d,v),g=t("./catch_filter.js")(p),m=t("./promise_resolver.js"),j=m._nodebackForPromise,b=s.errorObj,w=s.tryCatch;return e.prototype.toString=function(){return"[object Promise]"},e.prototype.caught=e.prototype["catch"]=function(t){var r=arguments.length;if(r>1){var n,i=new Array(r-1),o=0;for(n=0;r-1>n;++n){var s=arguments[n];if("function"!=typeof s)return e.reject(new c("Catch filter must inherit from Error or be a simple predicate function\n\n See http://goo.gl/o84o68\n"));i[o++]=s}i.length=o,t=arguments[n];var a=new g(i,t,this);return this._then(void 0,a.doFilter,void 0,a,void 0)}return this._then(void 0,t,void 0,void 0,void 0)},e.prototype.reflect=function(){return this._then(i,i,void 0,this,void 0)},e.prototype.then=function(t,e,r){if(v()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+s.classString(t);
-arguments.length>1&&(n+=", "+s.classString(e)),this._warn(n)}return this._then(t,e,r,void 0,void 0)},e.prototype.done=function(t,e,r){var n=this._then(t,e,r,void 0,void 0);n._setIsFinal()},e.prototype.spread=function(t,e){return this.all()._then(t,e,void 0,h,void 0)},e.prototype.isCancellable=function(){return!this.isResolved()&&this._cancellable()},e.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},e.prototype.all=function(){return new _(this).promise()},e.prototype.error=function(t){return this.caught(s.originatesFromRejection,t)},e.is=function(t){return t instanceof e},e.fromNode=function(t){var r=new e(l),n=w(t)(j(r));return n===b&&r._rejectCallback(n.e,!0,!0),r},e.all=function(t){return new _(t).promise()},e.defer=e.pending=function(){var t=new e(l);return new m(t)},e.cast=function(t){var r=f(t);if(!(r instanceof e)){var n=r;r=new e(l),r._fulfillUnchecked(n)}return r},e.resolve=e.fulfilled=e.cast,e.reject=e.rejected=function(t){var r=new e(l);return r._captureStackTrace(),r._rejectCallback(t,!0),r},e.setScheduler=function(t){if("function"!=typeof t)throw new c("fn must be a function\n\n See http://goo.gl/916lJJ\n");var e=a._schedule;return a._schedule=t,e},e.prototype._then=function(t,r,n,i,o){var s=void 0!==o,u=s?o:new e(l);s||(u._propagateFrom(this,5),u._captureStackTrace());var c=this._target();c!==this&&(void 0===i&&(i=this._boundTo),s||u._setIsMigrated());var h=c._addCallbacks(t,r,n,u,i);return c._isResolved()&&!c._isSettlePromisesQueued()&&a.invoke(c._settlePromiseAtPostResolution,c,h),u},e.prototype._settlePromiseAtPostResolution=function(t){this._isRejectionUnhandled()&&this._unsetRejectionIsUnhandled(),this._settlePromiseAt(t)},e.prototype._length=function(){return 131071&this._bitField},e.prototype._isFollowingOrFulfilledOrRejected=function(){return(939524096&this._bitField)>0},e.prototype._isFollowing=function(){return 536870912===(536870912&this._bitField)},e.prototype._setLength=function(t){this._bitField=-131072&this._bitField|131071&t},e.prototype._setFulfilled=function(){this._bitField=268435456|this._bitField},e.prototype._setRejected=function(){this._bitField=134217728|this._bitField},e.prototype._setFollowing=function(){this._bitField=536870912|this._bitField},e.prototype._setIsFinal=function(){this._bitField=33554432|this._bitField},e.prototype._isFinal=function(){return(33554432&this._bitField)>0},e.prototype._cancellable=function(){return(67108864&this._bitField)>0},e.prototype._setCancellable=function(){this._bitField=67108864|this._bitField},e.prototype._unsetCancellable=function(){this._bitField=-67108865&this._bitField},e.prototype._setIsMigrated=function(){this._bitField=4194304|this._bitField},e.prototype._unsetIsMigrated=function(){this._bitField=-4194305&this._bitField},e.prototype._isMigrated=function(){return(4194304&this._bitField)>0},e.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[5*t-5+4];return void 0===e&&this._isBound()?this._boundTo:e},e.prototype._promiseAt=function(t){return 0===t?this._promise0:this[5*t-5+3]},e.prototype._fulfillmentHandlerAt=function(t){return 0===t?this._fulfillmentHandler0:this[5*t-5+0]},e.prototype._rejectionHandlerAt=function(t){return 0===t?this._rejectionHandler0:this[5*t-5+1]},e.prototype._migrateCallbacks=function(t,r){var n=t._fulfillmentHandlerAt(r),i=t._rejectionHandlerAt(r),o=t._progressHandlerAt(r),s=t._promiseAt(r),a=t._receiverAt(r);s instanceof e&&s._setIsMigrated(),this._addCallbacks(n,i,o,s,a)},e.prototype._addCallbacks=function(t,e,r,n,i){var o=this._length();if(o>=131066&&(o=0,this._setLength(0)),0===o)this._promise0=n,void 0!==i&&(this._receiver0=i),"function"!=typeof t||this._isCarryingStackTrace()||(this._fulfillmentHandler0=t),"function"==typeof e&&(this._rejectionHandler0=e),"function"==typeof r&&(this._progressHandler0=r);else{var s=5*o-5;this[s+3]=n,this[s+4]=i,"function"==typeof t&&(this[s+0]=t),"function"==typeof e&&(this[s+1]=e),"function"==typeof r&&(this[s+2]=r)}return this._setLength(o+1),o},e.prototype._setProxyHandlers=function(t,e){var r=this._length();if(r>=131066&&(r=0,this._setLength(0)),0===r)this._promise0=e,this._receiver0=t;else{var n=5*r-5;this[n+3]=e,this[n+4]=t}this._setLength(r+1)},e.prototype._proxyPromiseArray=function(t,e){this._setProxyHandlers(t,e)},e.prototype._resolveCallback=function(t,r){if(!this._isFollowingOrFulfilledOrRejected()){if(t===this)return this._rejectCallback(n(),!1,!0);var i=f(t,this);if(!(i instanceof e))return this._fulfill(t);var o=1|(r?4:0);this._propagateFrom(i,o);var s=i._target();if(s._isPending()){for(var a=this._length(),u=0;a>u;++u)s._migrateCallbacks(this,u);this._setFollowing(),this._setLength(0),this._setFollowee(s)}else s._isFulfilled()?this._fulfillUnchecked(s._value()):this._rejectUnchecked(s._reason(),s._getCarriedStackTrace())}},e.prototype._rejectCallback=function(t,e,r){r||s.markAsOriginatingFromRejection(t);var n=s.ensureErrorObject(t),i=n===t;this._attachExtraTrace(n,e?i:!1),this._reject(t,i?void 0:n)},e.prototype._resolveFromResolver=function(t){var e=this;this._captureStackTrace(),this._pushContext();var r=!0,n=w(t)(function(t){null!==e&&(e._resolveCallback(t),e=null)},function(t){null!==e&&(e._rejectCallback(t,r),e=null)});r=!1,this._popContext(),void 0!==n&&n===b&&null!==e&&(e._rejectCallback(n.e,!0,!0),e=null)},e.prototype._settlePromiseFromHandler=function(t,e,r,i){if(!i._isRejected()){i._pushContext();var o;if(o=e!==h||this._isRejected()?w(t).call(e,r):w(t).apply(this._boundTo,r),i._popContext(),o===b||o===i||o===p){var s=o===i?n():o.e;i._rejectCallback(s,!1,!0)}else i._resolveCallback(o)}},e.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},e.prototype._followee=function(){return this._rejectionHandler0},e.prototype._setFollowee=function(t){this._rejectionHandler0=t},e.prototype._cleanValues=function(){this._cancellable()&&(this._cancellationParent=void 0)},e.prototype._propagateFrom=function(t,e){(1&e)>0&&t._cancellable()&&(this._setCancellable(),this._cancellationParent=t),(4&e)>0&&t._isBound()&&this._setBoundTo(t._boundTo)},e.prototype._fulfill=function(t){this._isFollowingOrFulfilledOrRejected()||this._fulfillUnchecked(t)},e.prototype._reject=function(t,e){this._isFollowingOrFulfilledOrRejected()||this._rejectUnchecked(t,e)},e.prototype._settlePromiseAt=function(t){var r=this._promiseAt(t),n=r instanceof e;if(n&&r._isMigrated())return r._unsetIsMigrated(),a.invoke(this._settlePromiseAt,this,t);var i=this._isFulfilled()?this._fulfillmentHandlerAt(t):this._rejectionHandlerAt(t),o=this._isCarryingStackTrace()?this._getCarriedStackTrace():void 0,s=this._settledValue,u=this._receiverAt(t);this._clearCallbackDataAtIndex(t),"function"==typeof i?n?this._settlePromiseFromHandler(i,u,s,r):i.call(u,s,r):u instanceof _?u._isResolved()||(this._isFulfilled()?u._promiseFulfilled(s,r):u._promiseRejected(s,r)):n&&(this._isFulfilled()?r._fulfill(s):r._reject(s,o)),t>=4&&4===(31&t)&&a.invokeLater(this._setLength,this,0)},e.prototype._clearCallbackDataAtIndex=function(t){if(0===t)this._isCarryingStackTrace()||(this._fulfillmentHandler0=void 0),this._rejectionHandler0=this._progressHandler0=this._receiver0=this._promise0=void 0;else{var e=5*t-5;this[e+3]=this[e+4]=this[e+0]=this[e+1]=this[e+2]=void 0}},e.prototype._isSettlePromisesQueued=function(){return-1073741824===(-1073741824&this._bitField)},e.prototype._setSettlePromisesQueued=function(){this._bitField=-1073741824|this._bitField},e.prototype._unsetSettlePromisesQueued=function(){this._bitField=1073741823&this._bitField},e.prototype._queueSettlePromises=function(){a.settlePromises(this),this._setSettlePromisesQueued()},e.prototype._fulfillUnchecked=function(t){if(t===this){var e=n();return this._attachExtraTrace(e),this._rejectUnchecked(e,void 0)}this._setFulfilled(),this._settledValue=t,this._cleanValues(),this._length()>0&&this._queueSettlePromises()},e.prototype._rejectUncheckedCheckError=function(t){var e=s.ensureErrorObject(t);this._rejectUnchecked(t,e===t?void 0:e)},e.prototype._rejectUnchecked=function(t,e){if(t===this){var r=n();return this._attachExtraTrace(r),this._rejectUnchecked(r)}return this._setRejected(),this._settledValue=t,this._cleanValues(),this._isFinal()?void a.throwLater(function(t){throw"stack"in t&&a.invokeFirst(d.unhandledRejection,void 0,t),t},void 0===e?t:e):(void 0!==e&&e!==t&&this._setCarriedStackTrace(e),void(this._length()>0?this._queueSettlePromises():this._ensurePossibleRejectionHandled()))},e.prototype._settlePromises=function(){this._unsetSettlePromisesQueued();for(var t=this._length(),e=0;t>e;e++)this._settlePromiseAt(e)},e._makeSelfResolutionError=n,t("./progress.js")(e,_),t("./method.js")(e,l,f,o),t("./bind.js")(e,l,f),t("./finally.js")(e,p,f),t("./direct_resolve.js")(e),t("./synchronous_inspection.js")(e),t("./join.js")(e,_,f,l),e.Promise=e,t("./map.js")(e,_,o,f,l),t("./cancel.js")(e),t("./using.js")(e,o,f,y),t("./generators.js")(e,o,l,f),t("./nodeify.js")(e),t("./call_get.js")(e),t("./props.js")(e,_,f,o),t("./race.js")(e,l,f,o),t("./reduce.js")(e,_,o,f,l),t("./settle.js")(e,_),t("./some.js")(e,_,o),t("./promisify.js")(e,l),t("./any.js")(e),t("./each.js")(e,l),t("./timers.js")(e,l),t("./filter.js")(e,l),s.toFastProperties(e),s.toFastProperties(e.prototype),r({a:1}),r({b:2}),r({c:3}),r(1),r(function(){}),r(void 0),r(!1),r(new e(l)),d.setBounds(a.firstLineError,s.lastLineError),e}},{"./any.js":1,"./async.js":2,"./bind.js":3,"./call_get.js":5,"./cancel.js":6,"./captured_trace.js":7,"./catch_filter.js":8,"./context.js":9,"./debuggability.js":10,"./direct_resolve.js":11,"./each.js":12,"./errors.js":13,"./filter.js":15,"./finally.js":16,"./generators.js":17,"./join.js":18,"./map.js":19,"./method.js":20,"./nodeify.js":21,"./progress.js":22,"./promise_array.js":24,"./promise_resolver.js":25,"./promisify.js":26,"./props.js":27,"./race.js":29,"./reduce.js":30,"./settle.js":32,"./some.js":33,"./synchronous_inspection.js":34,"./thenables.js":35,"./timers.js":36,"./using.js":37,"./util.js":38}],24:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){switch(t){case-2:return[];case-3:return{}}}function s(t){var n,i=this._promise=new e(r);t instanceof e&&(n=t,i._propagateFrom(n,5)),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var a=t("./util.js"),u=a.isArray;return s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function c(t,r){var s=n(this._values,this._promise);if(s instanceof e){if(s=s._target(),this._values=s,!s._isFulfilled())return s._isPending()?void s._then(c,this._reject,void 0,this,r):void this._reject(s._reason());if(s=s._value(),!u(s)){var a=new e.TypeError("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n");return void this.__hardReject__(a)}}else if(!u(s))return void this._promise._reject(i("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n")._reason());if(0===s.length)return void(-5===r?this._resolveEmptyArray():this._resolve(o(r)));var l=this.getActualLength(s.length);this._length=l,this._values=this.shouldCopyValues()?new Array(l):this._values;for(var h=this._promise,p=0;l>p;++p){var f=this._isResolved(),_=n(s[p],h);_ instanceof e?(_=_._target(),f?_._unsetRejectionIsUnhandled():_._isPending()?_._proxyPromiseArray(this,p):_._isFulfilled()?this._promiseFulfilled(_._value(),p):this._promiseRejected(_._reason(),p)):f||this._promiseFulfilled(_,p)}},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype.__hardReject__=s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1,!0)},s.prototype._promiseProgressed=function(t,e){this._promise._progress({index:e,value:t})},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var r=++this._totalResolved;r>=this._length&&this._resolve(this._values)},s.prototype._promiseRejected=function(t){this._totalResolved++,this._reject(t)},s.prototype.shouldCopyValues=function(){return!0},s.prototype.getActualLength=function(t){return t},s}},{"./util.js":38}],25:[function(t,e){"use strict";function r(t){return t instanceof Error&&p.getPrototypeOf(t)===Error.prototype}function n(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=p.keys(t),i=0;i<n.length;++i){var o=n[i];f.test(o)||(e[o]=t[o])}return e}return s.markAsOriginatingFromRejection(t),t}function i(t){return function(e,r){if(null!==t){if(e){var i=n(a(e));t._attachExtraTrace(i),t._reject(i)}else if(arguments.length>2){for(var o=arguments.length,s=new Array(o-1),u=1;o>u;++u)s[u-1]=arguments[u];t._fulfill(s)}else t._fulfill(r);t=null}}}var o,s=t("./util.js"),a=s.maybeWrapAsError,u=t("./errors.js"),c=u.TimeoutError,l=u.OperationalError,h=s.haveGetters,p=t("./es5.js"),f=/^(?:name|message|stack|cause)$/;if(o=h?function(t){this.promise=t}:function(t){this.promise=t,this.asCallback=i(t),this.callback=this.asCallback},h){var _={get:function(){return i(this.promise)}};p.defineProperty(o.prototype,"asCallback",_),p.defineProperty(o.prototype,"callback",_)}o._nodebackForPromise=i,o.prototype.toString=function(){return"[object PromiseResolver]"},o.prototype.resolve=o.prototype.fulfill=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._resolveCallback(t)},o.prototype.reject=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._rejectCallback(t)},o.prototype.progress=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._progress(t)},o.prototype.cancel=function(t){this.promise.cancel(t)},o.prototype.timeout=function(){this.reject(new c("timeout"))},o.prototype.isResolved=function(){return this.promise.isResolved()},o.prototype.toJSON=function(){return this.promise.toJSON()},e.exports=o},{"./errors.js":13,"./es5.js":14,"./util.js":38}],26:[function(t,e){"use strict";e.exports=function(e,r){function n(t){return!b.test(t)}function i(t){try{return t.__isPromisified__===!0}catch(e){return!1}}function o(t,e,r){var n=f.getDataPropertyOrDefault(t,e+r,j);return n?i(n):!1}function s(t,e,r){for(var n=0;n<t.length;n+=2){var i=t[n];if(r.test(i))for(var o=i.replace(r,""),s=0;s<t.length;s+=2)if(t[s]===o)throw new g("Cannot promisify an API that has normal methods with '%s'-suffix\n\n See http://goo.gl/iWrZbw\n".replace("%s",e))}}function a(t,e,r,n){for(var a=f.inheritedDataKeys(t),u=[],c=0;c<a.length;++c){var l=a[c],h=t[l],p=n===w?!0:w(l,h,t);"function"!=typeof h||i(h)||o(t,l,e)||!n(l,h,t,p)||u.push(l,h)}return s(u,e,r),u}function u(t,n,i,o){function s(){var i=n;n===p&&(i=this);var o=new e(r);o._captureStackTrace();var s="string"==typeof u&&this!==a?this[u]:t,c=_(o);try{s.apply(i,d(arguments,c))}catch(l){o._rejectCallback(v(l),!0,!0)}return o}var a=function(){return this}(),u=t;return"string"==typeof u&&(t=o),s.__isPromisified__=!0,s}function c(t,e,r,n){for(var i=new RegExp(k(e)+"$"),o=a(t,e,i,r),s=0,u=o.length;u>s;s+=2){var c=o[s],l=o[s+1],h=c+e;t[h]=n===E?E(c,p,c,l,e):n(l,function(){return E(c,p,c,l,e)})}return f.toFastProperties(t),t}function l(t,e){return E(t,e,void 0,t)}var h,p={},f=t("./util.js"),_=t("./promise_resolver.js")._nodebackForPromise,d=f.withAppended,v=f.maybeWrapAsError,y=f.canEvaluate,g=t("./errors").TypeError,m="Async",j={__isPromisified__:!0},b=/^(?:length|name|arguments|caller|callee|prototype|__isPromisified__)$/,w=function(t,e){return f.isIdentifier(t)&&"_"!==t.charAt(0)&&!f.isClass(e)},k=function(t){return t.replace(/([$])/,"\\$")},E=y?h:u;e.promisify=function(t,e){if("function"!=typeof t)throw new g("fn must be a function\n\n See http://goo.gl/916lJJ\n");if(i(t))return t;var r=l(t,arguments.length<2?p:e);return f.copyDescriptors(t,r,n),r},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/9ITlV0\n");e=Object(e);var r=e.suffix;"string"!=typeof r&&(r=m);var n=e.filter;"function"!=typeof n&&(n=w);var i=e.promisifier;if("function"!=typeof i&&(i=E),!f.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/8FZo5V\n");for(var o=f.inheritedDataKeys(t),s=0;s<o.length;++s){var a=t[o[s]];"constructor"!==o[s]&&f.isClass(a)&&(c(a.prototype,r,n,i),c(a,r,n,i))}return c(t,r,n,i)}}},{"./errors":13,"./promise_resolver.js":25,"./util.js":38}],27:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){for(var e=c.keys(t),r=e.length,n=new Array(2*r),i=0;r>i;++i){var o=e[i];n[i]=t[o],n[i+r]=o}this.constructor$(n)}function s(t){var r,s=n(t);return u(s)?(r=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&r._propagateFrom(s,4),r):i("cannot await properties of a non-object\n\n See http://goo.gl/OsFKC8\n")}var a=t("./util.js"),u=a.isObject,c=t("./es5.js");a.inherits(o,r),o.prototype._init=function(){this._init$(void 0,-3)},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var r=++this._totalResolved;if(r>=this._length){for(var n={},i=this.length(),o=0,s=this.length();s>o;++o)n[this._values[o+i]]=this._values[o];this._resolve(n)}},o.prototype._promiseProgressed=function(t,e){this._promise._progress({key:this._values[e+this.length()],value:t})},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5.js":14,"./util.js":38}],28:[function(t,e){"use strict";function r(t,e,r,n,i){for(var o=0;i>o;++o)r[o+n]=t[o+e],t[o+e]=void 0}function n(t){this._capacity=t,this._length=0,this._front=0}n.prototype._willBeOverCapacity=function(t){return this._capacity<t},n.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var r=this._front+e&this._capacity-1;this[r]=t,this._length=e+1},n.prototype._unshiftOne=function(t){var e=this._capacity;this._checkCapacity(this.length()+1);var r=this._front,n=(r-1&e-1^e)-e;this[n]=t,this._front=n,this._length=this.length()+1},n.prototype.unshift=function(t,e,r){this._unshiftOne(r),this._unshiftOne(e),this._unshiftOne(t)},n.prototype.push=function(t,e,r){var n=this.length()+3;if(this._willBeOverCapacity(n))return this._pushOne(t),this._pushOne(e),void this._pushOne(r);var i=this._front+n-3;this._checkCapacity(n);var o=this._capacity-1;this[i+0&o]=t,this[i+1&o]=e,this[i+2&o]=r,this._length=n},n.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},n.prototype.length=function(){return this._length},n.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},n.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,i=this._length,o=n+i&e-1;r(this,0,this,e,o)},e.exports=n},{}],29:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t,o){var u=n(t);if(u instanceof e)return a(u);if(!s(t))return i("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n");var c=new e(r);void 0!==o&&c._propagateFrom(o,5);for(var l=c._fulfill,h=c._reject,p=0,f=t.length;f>p;++p){var _=t[p];(void 0!==_||p in t)&&e.cast(_)._then(l,h,void 0,c,null)}return c}var s=t("./util.js").isArray,a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util.js":38}],30:[function(t,e){"use strict";e.exports=function(e,r,n,i,o){function s(t,r,n,s){this.constructor$(t),this._promise._captureStackTrace(),this._preservedValues=s===o?[]:null,this._zerothIsAccum=void 0===n,this._gotAccum=!1,this._reducingIndex=this._zerothIsAccum?1:0,this._valuesPhase=void 0;var u=i(n,this._promise),l=!1,h=u instanceof e;h&&(u=u._target(),u._isPending()?u._proxyPromiseArray(this,-1):u._isFulfilled()?(n=u._value(),this._gotAccum=!0):(this._reject(u._reason()),l=!0)),h||this._zerothIsAccum||(this._gotAccum=!0),this._callback=r,this._accum=n,l||c.invoke(a,this,void 0)}function a(){this._init$(void 0,-5)}function u(t,e,r,i){if("function"!=typeof e)return n("fn must be a function\n\n See http://goo.gl/916lJJ\n");var o=new s(t,e,r,i);return o.promise()}var c=t("./async.js"),l=t("./util.js"),h=l.tryCatch,p=l.errorObj;l.inherits(s,r),s.prototype._init=function(){},s.prototype._resolveEmptyArray=function(){(this._gotAccum||this._zerothIsAccum)&&this._resolve(null!==this._preservedValues?[]:this._accum)},s.prototype._promiseFulfilled=function(t,r){var n=this._values;n[r]=t;var o,s=this.length(),a=this._preservedValues,u=null!==a,c=this._gotAccum,l=this._valuesPhase;if(!l)for(l=this._valuesPhase=new Array(s),o=0;s>o;++o)l[o]=0;if(o=l[r],0===r&&this._zerothIsAccum?(this._accum=t,this._gotAccum=c=!0,l[r]=0===o?1:2):-1===r?(this._accum=t,this._gotAccum=c=!0):0===o?l[r]=1:(l[r]=2,this._accum=t),c){for(var f,_=this._callback,d=this._promise._boundTo,v=this._reducingIndex;s>v;++v)if(o=l[v],2!==o){if(1!==o)return;if(t=n[v],this._promise._pushContext(),u?(a.push(t),f=h(_).call(d,t,v,s)):f=h(_).call(d,this._accum,t,v,s),this._promise._popContext(),f===p)return this._reject(f.e);var y=i(f,this._promise);if(y instanceof e){if(y=y._target(),y._isPending())return l[v]=4,y._proxyPromiseArray(this,v);if(!y._isFulfilled())return this._reject(y._reason());f=y._value()}this._reducingIndex=v+1,this._accum=f}else this._reducingIndex=v+1;this._resolve(u?a:this._accum)}},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,r,n){return u(t,e,r,n)}}},{"./async.js":2,"./util.js":38}],31:[function(t,e){"use strict";var r,n=function(){throw new Error("No async scheduler available\n\n See http://goo.gl/m3OTXk\n")};if(t("./util.js").isNode){var i=process.versions.node.split(".").map(Number);r=0===i[0]&&i[1]>10||i[0]>0?global.setImmediate:process.nextTick,r||(r="undefined"!=typeof setImmediate?setImmediate:"undefined"!=typeof setTimeout?setTimeout:n)}else"undefined"!=typeof MutationObserver?(r=function(t){var e=document.createElement("div"),r=new MutationObserver(t);return r.observe(e,{attributes:!0}),function(){e.classList.toggle("foo")}},r.isStatic=!0):r="undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:n;e.exports=r},{"./util.js":38}],32:[function(t,e){"use strict";e.exports=function(e,r){function n(t){this.constructor$(t)}var i=e.PromiseInspection,o=t("./util.js");o.inherits(n,r),n.prototype._promiseResolved=function(t,e){this._values[t]=e;var r=++this._totalResolved;r>=this._length&&this._resolve(this._values)},n.prototype._promiseFulfilled=function(t,e){var r=new i;r._bitField=268435456,r._settledValue=t,this._promiseResolved(e,r)},n.prototype._promiseRejected=function(t,e){var r=new i;r._bitField=134217728,r._settledValue=t,this._promiseResolved(e,r)},e.settle=function(t){return new n(t).promise()},e.prototype.settle=function(){return new n(this).promise()}}},{"./util.js":38}],33:[function(t,e){"use strict";e.exports=function(e,r,n){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return n("expecting a positive integer\n\n See http://goo.gl/1wAmHx\n");var r=new i(t),o=r.promise();return r.setHowMany(e),r.init(),o}var s=t("./util.js"),a=t("./errors.js").RangeError,u=t("./errors.js").AggregateError,c=s.isArray;s.inherits(i,r),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=c(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){this._addFulfilled(t),this._fulfilled()===this.howMany()&&(this._values.length=this.howMany(),this._resolve(1===this.howMany()&&this._unwrap?this._values[0]:this._values))},i.prototype._promiseRejected=function(t){if(this._addRejected(t),this.howMany()>this._canPossiblyFulfill()){for(var e=new u,r=this.length();r<this._values.length;++r)e.push(this._values[r]);this._reject(e)}},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors.js":13,"./util.js":38}],34:[function(t,e){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValue=t._settledValue):(this._bitField=0,this._settledValue=void 0)}e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/hc1DLj\n");return this._settledValue},e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/hPuiwB\n");return this._settledValue},e.prototype.isFulfilled=t.prototype._isFulfilled=function(){return(268435456&this._bitField)>0},e.prototype.isRejected=t.prototype._isRejected=function(){return(134217728&this._bitField)>0},e.prototype.isPending=t.prototype._isPending=function(){return 0===(402653184&this._bitField)},e.prototype.isResolved=t.prototype._isResolved=function(){return(402653184&this._bitField)>0},t.prototype.isPending=function(){return this._target()._isPending()},t.prototype.isRejected=function(){return this._target()._isRejected()},t.prototype.isFulfilled=function(){return this._target()._isFulfilled()},t.prototype.isResolved=function(){return this._target()._isResolved()},t.prototype._value=function(){return this._settledValue},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue},t.prototype.value=function(){var t=this._target();if(!t.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/hc1DLj\n");return t._settledValue},t.prototype.reason=function(){var t=this._target();if(!t.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/hPuiwB\n");return t._unsetRejectionIsUnhandled(),t._settledValue},t.PromiseInspection=e}},{}],35:[function(t,e){"use strict";e.exports=function(e,r){function n(t,n){if(c(t)){if(t instanceof e)return t;if(o(t)){var l=new e(r);return t._then(l._fulfillUnchecked,l._rejectUncheckedCheckError,l._progressUnchecked,l,null),l}var h=a.tryCatch(i)(t);if(h===u){n&&n._pushContext();var l=e.reject(h.e);return n&&n._popContext(),l}if("function"==typeof h)return s(t,h,n)}return t}function i(t){return t.then}function o(t){return l.call(t,"_promise0")}function s(t,n,i){function o(r){l&&(t===r?l._rejectCallback(e._makeSelfResolutionError(),!1,!0):l._resolveCallback(r),l=null)}function s(t){l&&(l._rejectCallback(t,p,!0),l=null)}function c(t){l&&"function"==typeof l._progress&&l._progress(t)}var l=new e(r),h=l;i&&i._pushContext(),l._captureStackTrace(),i&&i._popContext();var p=!0,f=a.tryCatch(n).call(t,o,s,c);return p=!1,l&&f===u&&(l._rejectCallback(f.e,!0,!0),l=null),h}var a=t("./util.js"),u=a.errorObj,c=a.isObject,l={}.hasOwnProperty;return n}},{"./util.js":38}],36:[function(t,e){"use strict";e.exports=function(e,r){function n(t){var e=this;return e instanceof Number&&(e=+e),clearTimeout(e),t}function i(t){var e=this;throw e instanceof Number&&(e=+e),clearTimeout(e),t}var o=t("./util.js"),s=e.TimeoutError,a=function(t,e){if(t.isPending()){"string"!=typeof e&&(e="operation timed out");var r=new s(e);o.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._cancel(r)}},u=function(t){return c(+this).thenReturn(t)},c=e.delay=function(t,n){if(void 0===n){n=t,t=void 0;var i=new e(r);return setTimeout(function(){i._fulfill()},n),i}return n=+n,e.resolve(t)._then(u,null,null,n,void 0)};e.prototype.delay=function(t){return c(this,t)},e.prototype.timeout=function(t,e){t=+t;var r=this.then().cancellable();r._cancellationParent=this;var o=setTimeout(function(){a(r,e)},t);return r._then(n,i,void 0,o,void 0)}}},{"./util.js":38}],37:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){for(var r=t.length,n=0;r>n;++n){var i=t[n];if(i.isRejected())return e.reject(i.error());t[n]=i._settledValue}return t}function s(t){setTimeout(function(){throw t},0)}function a(t){var e=n(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,r){function i(){if(o>=u)return c.resolve();var l=a(t[o++]);if(l instanceof e&&l._isDisposable()){try{l=n(l._getDisposer().tryDispose(r),t.promise)}catch(h){return s(h)}if(l instanceof e)return l._then(i,s,null,null,null)}i()}var o=0,u=t.length,c=e.defer();return i(),c.promise}function c(t){var e=new v;return e._settledValue=t,e._bitField=268435456,u(this,e).thenReturn(t)}function l(t){var e=new v;return e._settledValue=t,e._bitField=134217728,u(this,e).thenThrow(t)}function h(t,e,r){this._data=t,this._promise=e,this._context=r}function p(t,e,r){this.constructor$(t,e,r)}function f(t){return h.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}var _=t("./errors.js").TypeError,d=t("./util.js").inherits,v=e.PromiseInspection;h.prototype.data=function(){return this._data},h.prototype.promise=function(){return this._promise},h.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():null},h.prototype.tryDispose=function(t){var e=this.resource(),r=this._context;void 0!==r&&r._pushContext();var n=null!==e?this.doDispose(e,t):null;return void 0!==r&&r._popContext(),this._promise._unsetDisposable(),this._data=null,n},h.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},d(p,h),p.prototype.doDispose=function(t,e){var r=this.data();return r.call(t,t,e)},e.using=function(){var t=arguments.length;if(2>t)return r("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return r("fn must be a function\n\n See http://goo.gl/916lJJ\n");t--;for(var s=new Array(t),a=0;t>a;++a){var u=arguments[a];if(h.isDisposer(u)){var p=u;u=u.promise(),u._setDisposable(p)}else{var _=n(u);_ instanceof e&&(u=_._then(f,null,null,{resources:s,index:a},void 0))}s[a]=u}var d=e.settle(s).then(o).then(function(t){d._pushContext();var e;try{e=i.apply(void 0,t)}finally{d._popContext()}return e})._then(c,l,void 0,s,void 0);return s.promise=d,d},e.prototype._setDisposable=function(t){this._bitField=262144|this._bitField,this._disposer=t},e.prototype._isDisposable=function(){return(262144&this._bitField)>0
-},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-262145&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new _}}},{"./errors.js":13,"./util.js":38}],38:[function(t,e,r){"use strict";function n(){try{return T.apply(this,arguments)}catch(t){return F.e=t,F}}function i(t){return T=t,n}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return!o(t)}function a(t){return o(t)?new Error(v(t)):t}function u(t,e){var r,n=t.length,i=new Array(n+1);for(r=0;n>r;++r)i[r]=t[r];return i[r]=e,i}function c(t,e,r){if(!w.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var n=Object.getOwnPropertyDescriptor(t,e);return null!=n?null==n.get&&null==n.set?n.value:r:void 0}function l(t,e,r){if(o(t))return t;var n={value:r,configurable:!0,enumerable:!1,writable:!0};return w.defineProperty(t,e,n),t}function h(t){throw t}function p(t){try{if("function"==typeof t){var e=w.names(t.prototype);return w.isES5?e.length>1:e.length>0&&!(1===e.length&&"constructor"===e[0])}return!1}catch(r){return!1}}function f(t){function e(){}e.prototype=t;for(var r=8;r--;)new e;return t}function _(t){return R.test(t)}function d(t,e,r){for(var n=new Array(t),i=0;t>i;++i)n[i]=e+i+r;return n}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){try{l(t,"isOperational",!0)}catch(e){}}function g(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function m(t){return t instanceof Error&&w.propertyIsWritable(t,"stack")}function j(t){return{}.toString.call(t)}function b(t,e,r){for(var n=w.names(t),i=0;i<n.length;++i){var o=n[i];r(o)&&w.defineProperty(e,o,w.getDescriptor(t,o))}}var w=t("./es5.js"),k="undefined"==typeof navigator,E=function(){try{var t={};return w.defineProperty(t,"f",{get:function(){return 3}}),3===t.f}catch(e){return!1}}(),F={e:{}},T,C=function(t,e){function r(){this.constructor=t,this.constructor$=e;for(var r in e.prototype)n.call(e.prototype,r)&&"$"!==r.charAt(r.length-1)&&(this[r+"$"]=e.prototype[r])}var n={}.hasOwnProperty;return r.prototype=e.prototype,t.prototype=new r,t.prototype},x=function(){return"string"!==this}.call("string"),P=function(){if(w.isES5){var t=Object.prototype,e=Object.getOwnPropertyNames;return function(r){for(var n=[],i=Object.create(null);null!=r&&r!==t;){var o;try{o=e(r)}catch(s){return n}for(var a=0;a<o.length;++a){var u=o[a];if(!i[u]){i[u]=!0;var c=Object.getOwnPropertyDescriptor(r,u);null!=c&&null==c.get&&null==c.set&&n.push(u)}}r=w.getPrototypeOf(r)}return n}}return function(t){var e=[];for(var r in t)e.push(r);return e}}(),R=/^[a-z$_][a-z$_0-9]*$/i,A=function(){return"stack"in new Error?function(t){return m(t)?t:new Error(v(t))}:function(t){if(m(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),S={isClass:p,isIdentifier:_,inheritedDataKeys:P,getDataPropertyOrDefault:c,thrower:h,isArray:w.isArray,haveGetters:E,notEnumerableProp:l,isPrimitive:o,isObject:s,canEvaluate:k,errorObj:F,tryCatch:i,inherits:C,withAppended:u,maybeWrapAsError:a,wrapsPrimitiveReceiver:x,toFastProperties:f,filledRange:d,toString:v,canAttachTrace:m,ensureErrorObject:A,originatesFromRejection:g,markAsOriginatingFromRejection:y,classString:j,copyDescriptors:b,hasDevTools:"undefined"!=typeof chrome&&chrome&&"function"==typeof chrome.loadTimes,isNode:"undefined"!=typeof process&&"[object process]"===j(process).toLowerCase()};try{throw new Error}catch(O){S.lastLineError=O}e.exports=S},{"./es5.js":14}],39:[function(t,e){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return"function"==typeof t}function i(t){return"number"==typeof t}function o(t){return"object"==typeof t&&null!==t}function s(t){return void 0===t}e.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(t){if(!i(t)||0>t||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},r.prototype.emit=function(t){var e,r,i,a,u,c;if(this._events||(this._events={}),"error"===t&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(e=arguments[1],e instanceof Error)throw e;throw TypeError('Uncaught, unspecified "error" event.')}if(r=this._events[t],s(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:for(i=arguments.length,a=new Array(i-1),u=1;i>u;u++)a[u-1]=arguments[u];r.apply(this,a)}else if(o(r)){for(i=arguments.length,a=new Array(i-1),u=1;i>u;u++)a[u-1]=arguments[u];for(c=r.slice(),i=c.length,u=0;i>u;u++)c[u].apply(this,a)}return!0},r.prototype.addListener=function(t,e){var i;if(!n(e))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",t,n(e.listener)?e.listener:e),this._events[t]?o(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,o(this._events[t])&&!this._events[t].warned){var i;i=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[t].length>i&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(t,e){function r(){this.removeListener(t,r),i||(i=!0,e.apply(this,arguments))}if(!n(e))throw TypeError("listener must be a function");var i=!1;return r.listener=e,this.on(t,r),this},r.prototype.removeListener=function(t,e){var r,i,s,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(r=this._events[t],s=r.length,i=-1,r===e||n(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(o(r)){for(a=s;a-->0;)if(r[a]===e||r[a].listener&&r[a].listener===e){i=a;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},r.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[t],n(r))this.removeListener(t,r);else for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},r.prototype.listeners=function(t){var e;return e=this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},r.listenerCount=function(t,e){var r;return r=t._events&&t._events[e]?n(t._events[e])?1:t._events[e].length:0}},{}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise); \ No newline at end of file
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,r;return function n(t,e,r){function i(s,a){if(!e[s]){if(!t[s]){var u="function"==typeof _dereq_&&_dereq_;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var r=t[s][1][e];return i(r?r:e)},l,l.exports,n,t,e,r)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s<r.length;s++)i(r[s]);return i}({1:[function(t,e){"use strict";e.exports=function(t){function e(t){var e=new r(t),n=e.promise();return e.setHowMany(1),e.setUnwrap(),e.init(),n}var r=t._SomePromiseArray;t.any=function(t){return e(t)},t.prototype.any=function(){return e(this)}}},{}],2:[function(t,e){"use strict";function r(){this._isTickUsed=!1,this._lateQueue=new c(16),this._normalQueue=new c(16),this._trampolineEnabled=!0;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=u.isStatic?u(this.drainQueues):u}function n(t,e,r){var n=this._getDomain();void 0!==n&&(t=n.bind(t)),this._lateQueue.push(t,e,r),this._queueTick()}function i(t,e,r){var n=this._getDomain();void 0!==n&&(t=n.bind(t)),this._normalQueue.push(t,e,r),this._queueTick()}function o(t){var e=this._getDomain();if(void 0!==e){var r=e.bind(t._settlePromises);this._normalQueue.push(r,t,void 0)}else this._normalQueue._pushOne(t);this._queueTick()}var s;try{throw new Error}catch(a){s=a}var u=t("./schedule.js"),c=t("./queue.js"),l=t("./util.js");r.prototype.disableTrampolineIfNecessary=function(){l.hasDevTools&&(this._trampolineEnabled=!1)},r.prototype.enableTrampoline=function(){this._trampolineEnabled||(this._trampolineEnabled=!0,this._schedule=function(t){setTimeout(t,0)})},r.prototype.haveItemsQueued=function(){return this._normalQueue.length()>0},r.prototype.throwLater=function(t,e){1===arguments.length&&(e=t,t=function(){throw e});var r=this._getDomain();if(void 0!==r&&(t=r.bind(t)),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/m3OTXk\n")}},r.prototype._getDomain=function(){};l.hasDevTools?(r.prototype.invokeLater=function(t,e,r){this._trampolineEnabled?n.call(this,t,e,r):setTimeout(function(){t.call(e,r)},100)},r.prototype.invoke=function(t,e,r){this._trampolineEnabled?i.call(this,t,e,r):setTimeout(function(){t.call(e,r)},0)},r.prototype.settlePromises=function(t){this._trampolineEnabled?o.call(this,t):setTimeout(function(){t._settlePromises()},0)}):(r.prototype.invokeLater=n,r.prototype.invoke=i,r.prototype.settlePromises=o),r.prototype.invokeFirst=function(t,e,r){var n=this._getDomain();void 0!==n&&(t=n.bind(t)),this._normalQueue.unshift(t,e,r),this._queueTick()},r.prototype._drainQueue=function(t){for(;t.length()>0;){var e=t.shift();if("function"==typeof e){var r=t.shift(),n=t.shift();e.call(r,n)}else e._settlePromises()}},r.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._drainQueue(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=new r,e.exports.firstLineError=s},{"./queue.js":28,"./schedule.js":31,"./util.js":38,events:39}],3:[function(t,e){"use strict";e.exports=function(t,e,r){var n=function(t,e){this._reject(e)},i=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(n,n,null,this,t)},o=function(t,e){this._setBoundTo(t),this._isPending()&&this._resolveCallback(e.target)},s=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(n){var a=r(n),u=new t(e);u._propagateFrom(this,1);var c=this._target();if(a instanceof t){var l={promiseRejectionQueued:!1,promise:u,target:c,bindingPromise:a};c._then(e,i,u._progress,u,l),a._then(o,s,u._progress,u,l)}else u._setBoundTo(n),u._resolveCallback(c);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=131072|this._bitField,this._boundTo=t):this._bitField=-131073&this._bitField},t.prototype._isBound=function(){return 131072===(131072&this._bitField)},t.bind=function(n,i){var o=r(n),s=new t(e);return o instanceof t?o._then(function(t){s._setBoundTo(t),s._resolveCallback(i)},s._reject,s._progress,s,null):(s._setBoundTo(n),s._resolveCallback(i)),s}}},{}],4:[function(t,e){"use strict";function r(){try{Promise===i&&(Promise=n)}catch(t){}return i}var n;"undefined"!=typeof Promise&&(n=Promise);var i=t("./promise.js")();i.noConflict=r,e.exports=i},{"./promise.js":23}],5:[function(t,e){"use strict";var r=Object.create;if(r){var n=r(null),i=r(null);n[" size"]=i[" size"]=0}e.exports=function(e){function r(t,r){var n;if(null!=t&&(n=t[r]),"function"!=typeof n){var i="Object "+a.classString(t)+" has no method '"+a.toString(r)+"'";throw new e.TypeError(i)}return n}function n(t){var e=this.pop(),n=r(t,e);return n.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}{var s,a=t("./util.js"),u=a.canEvaluate;a.isIdentifier}e.prototype.call=function(t){for(var e=arguments.length,r=new Array(e-1),i=1;e>i;++i)r[i-1]=arguments[i];return r.push(t),this._then(n,void 0,void 0,r,void 0)},e.prototype.get=function(t){var e,r="number"==typeof t;if(r)e=o;else if(u){var n=s(t);e=null!==n?n:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util.js":38}],6:[function(t,e){"use strict";e.exports=function(e){var r=t("./errors.js"),n=t("./async.js"),i=r.CancellationError;e.prototype._cancel=function(t){if(!this.isCancellable())return this;for(var e,r=this;void 0!==(e=r._cancellationParent)&&e.isCancellable();)r=e;this._unsetCancellable(),r._target()._rejectCallback(t,!1,!0)},e.prototype.cancel=function(t){return this.isCancellable()?(void 0===t&&(t=new i),n.invokeLater(this._cancel,this,t),this):this},e.prototype.cancellable=function(){return this._cancellable()?this:(n.enableTrampoline(),this._setCancellable(),this._cancellationParent=void 0,this)},e.prototype.uncancellable=function(){var t=this.then();return t._unsetCancellable(),t},e.prototype.fork=function(t,e,r){var n=this._then(t,e,r,void 0,void 0);return n._setCancellable(),n._cancellationParent=void 0,n}}},{"./async.js":2,"./errors.js":13}],7:[function(t,e){"use strict";e.exports=function(){function e(t){this._parent=t;var r=this._length=1+(void 0===t?0:t._length);j(this,e),r>32&&this.uncycle()}function r(t,e){for(var r=0;r<e.length-1;++r)e[r].push("From previous event:"),e[r]=e[r].join("\n");return r<e.length&&(e[r]=e[r].join("\n")),t+"\n"+e.join("\n")}function n(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function i(t){for(var e=t[0],r=1;r<t.length;++r){for(var n=t[r],i=e.length-1,o=e[i],s=-1,a=n.length-1;a>=0;--a)if(n[a]===o){s=a;break}for(var a=s;a>=0;--a){var u=n[a];if(e[i]!==u)break;e.pop(),i--}e=n}}function o(t){for(var e=[],r=0;r<t.length;++r){var n=t[r],i=_.test(n)||" (No stack trace)"===n,o=i&&y(n);i&&!o&&(v&&" "!==n.charAt(0)&&(n=" "+n),e.push(n))}return e}function s(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),r=0;r<e.length;++r){var n=e[r];if(" (No stack trace)"===n||_.test(n))break}return r>0&&(e=e.slice(r)),e}function a(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t.toString();var r=/\[object [a-zA-Z0-9$_]+\]/;if(r.test(e))try{var n=JSON.stringify(t);e=n}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+u(e)+">, no stack trace)"}function u(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function c(t){var e=t.match(g);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}var l,h=t("./async.js"),p=t("./util.js"),f=/[\\\/]bluebird[\\\/]js[\\\/](main|debug|zalgo|instrumented)/,_=null,d=null,v=!1;p.inherits(e,Error),e.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],r={},n=0,i=this;void 0!==i;++n)e.push(i),i=i._parent;t=this._length=n;for(var n=t-1;n>=0;--n){var o=e[n].stack;void 0===r[o]&&(r[o]=n)}for(var n=0;t>n;++n){var s=e[n].stack,a=r[s];if(void 0!==a&&a!==n){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[n]._parent=void 0,e[n]._length=1;var u=n>0?e[n-1]:this;t-1>a?(u._parent=e[a+1],u._parent.uncycle(),u._length=u._parent._length+1):(u._parent=void 0,u._length=1);for(var c=u._length+1,l=n-2;l>=0;--l)e[l]._length=c,c++;return}}}},e.prototype.parent=function(){return this._parent},e.prototype.hasParent=function(){return void 0!==this._parent},e.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var s=e.parseStackAndMessage(t),a=s.message,u=[s.stack],c=this;void 0!==c;)u.push(o(c.stack.split("\n"))),c=c._parent;i(u),n(u),p.notEnumerableProp(t,"stack",r(a,u)),p.notEnumerableProp(t,"__stackCleaned__",!0)}},e.parseStackAndMessage=function(t){var e=t.stack,r=t.toString();return e="string"==typeof e&&e.length>0?s(t):[" (No stack trace)"],{message:r,stack:o(e)}},e.formatAndLogError=function(t,e){if("undefined"!=typeof console){var r;if("object"==typeof t||"function"==typeof t){var n=t.stack;r=e+d(n,t)}else r=e+String(t);"function"==typeof l?l(r):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}},e.unhandledRejection=function(t){e.formatAndLogError(t,"^--- With additional stack trace: ")},e.isSupported=function(){return"function"==typeof j},e.fireRejectionEvent=function(t,r,n,i){var o=!1;try{"function"==typeof r&&(o=!0,"rejectionHandled"===t?r(i):r(n,i))}catch(s){h.throwLater(s)}var a=!1;try{a=b(t,n,i)}catch(s){a=!0,h.throwLater(s)}var u=!1;if(m)try{u=m(t.toLowerCase(),{reason:n,promise:i})}catch(s){u=!0,h.throwLater(s)}a||o||u||"unhandledRejection"!==t||e.formatAndLogError(n,"Unhandled rejection ")};var y=function(){return!1},g=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;e.setBounds=function(t,r){if(e.isSupported()){for(var n,i,o=t.stack.split("\n"),s=r.stack.split("\n"),a=-1,u=-1,l=0;l<o.length;++l){var h=c(o[l]);if(h){n=h.fileName,a=h.line;break}}for(var l=0;l<s.length;++l){var h=c(s[l]);if(h){i=h.fileName,u=h.line;break}}0>a||0>u||!n||!i||n!==i||a>=u||(y=function(t){if(f.test(t))return!0;var e=c(t);return e&&e.fileName===n&&a<=e.line&&e.line<=u?!0:!1})}};var m,j=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():a(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit=Error.stackTraceLimit+6,_=t,d=e;var r=Error.captureStackTrace;return y=function(t){return f.test(t)},function(t,e){Error.stackTraceLimit=Error.stackTraceLimit+6,r(t,e),Error.stackTraceLimit=Error.stackTraceLimit-6}}var n=new Error;if("string"==typeof n.stack&&n.stack.split("\n")[0].indexOf("stackDetection@")>=0)return _=/@/,d=e,v=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in n||!i?(d=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?a(e):e.toString()},null):(_=t,d=e,function(t){Error.stackTraceLimit=Error.stackTraceLimit+6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit=Error.stackTraceLimit-6})}([]),b=function(){if(p.isNode)return function(t,e,r){return"rejectionHandled"===t?process.emit(t,r):process.emit(t,e,r)};var t=!1,e=!0;try{var r=new self.CustomEvent("test");t=r instanceof CustomEvent}catch(n){}if(!t)try{var i=document.createEvent("CustomEvent");i.initCustomEvent("testingtheevent",!1,!0,{}),self.dispatchEvent(i)}catch(n){e=!1}e&&(m=function(e,r){var n;return t?n=new self.CustomEvent(e,{detail:r,bubbles:!1,cancelable:!0}):self.dispatchEvent&&(n=document.createEvent("CustomEvent"),n.initCustomEvent(e,!1,!0,r)),n?!self.dispatchEvent(n):!1});var o={};return o.unhandledRejection="onunhandledRejection".toLowerCase(),o.rejectionHandled="onrejectionHandled".toLowerCase(),function(t,e,r){var n=o[t],i=self[n];return i?("rejectionHandled"===t?i.call(self,r):i.call(self,e,r),!0):!1}}();return"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(l=function(t){console.warn(t)},p.isNode&&process.stderr.isTTY?l=function(t){process.stderr.write(""+t+"\n")}:p.isNode||"string"!=typeof(new Error).stack||(l=function(t){console.warn("%c"+t,"color: red")})),e}},{"./async.js":2,"./util.js":38}],8:[function(t,e){"use strict";e.exports=function(e){function r(t,e,r){this._instances=t,this._callback=e,this._promise=r}function n(t,e){var r={},n=s(t).call(r,e);if(n===a)return n;var i=u(r);return i.length?(a.e=new c("Catch filter must inherit from Error or be a simple predicate function\n\n See http://goo.gl/o84o68\n"),a):n}var i=t("./util.js"),o=t("./errors.js"),s=i.tryCatch,a=i.errorObj,u=t("./es5.js").keys,c=o.TypeError;return r.prototype.doFilter=function(t){for(var r=this._callback,i=this._promise,o=i._boundTo,u=0,c=this._instances.length;c>u;++u){var l=this._instances[u],h=l===Error||null!=l&&l.prototype instanceof Error;if(h&&t instanceof l){var p=s(r).call(o,t);return p===a?(e.e=p.e,e):p}if("function"==typeof l&&!h){var f=n(l,t);if(f===a){t=a.e;break}if(f){var p=s(r).call(o,t);return p===a?(e.e=p.e,e):p}}}return e.e=t,e},r}},{"./errors.js":13,"./es5.js":14,"./util.js":38}],9:[function(t,e){"use strict";e.exports=function(t,e,r){function n(){this._trace=new e(o())}function i(){return r()?new n:void 0}function o(){var t=s.length-1;return t>=0?s[t]:void 0}var s=[];return n.prototype._pushContext=function(){r()&&void 0!==this._trace&&s.push(this._trace)},n.prototype._popContext=function(){r()&&void 0!==this._trace&&s.pop()},t.prototype._peekContext=o,t.prototype._pushContext=n.prototype._pushContext,t.prototype._popContext=n.prototype._popContext,i}},{}],10:[function(t,e){"use strict";e.exports=function(e,r){var n,i,o=t("./async.js"),s=t("./errors.js").Warning,a=t("./util.js"),u=a.canAttachTrace,c=!1||a.isNode&&(!!process.env.BLUEBIRD_DEBUG||"development"===process.env.NODE_ENV);return c&&o.disableTrampolineIfNecessary(),e.prototype._ensurePossibleRejectionHandled=function(){this._setRejectionIsUnhandled(),o.invokeLater(this._notifyUnhandledRejection,this,void 0)},e.prototype._notifyUnhandledRejectionIsHandled=function(){r.fireRejectionEvent("rejectionHandled",n,void 0,this)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._getCarriedStackTrace()||this._settledValue;this._setUnhandledRejectionIsNotified(),r.fireRejectionEvent("unhandledRejection",i,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=524288|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-524289&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(524288&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=2097152|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-2097153&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(2097152&this._bitField)>0},e.prototype._setCarriedStackTrace=function(t){this._bitField=1048576|this._bitField,this._fulfillmentHandler0=t},e.prototype._isCarryingStackTrace=function(){return(1048576&this._bitField)>0},e.prototype._getCarriedStackTrace=function(){return this._isCarryingStackTrace()?this._fulfillmentHandler0:void 0},e.prototype._captureStackTrace=function(){return c&&(this._trace=new r(this._peekContext())),this},e.prototype._attachExtraTrace=function(t,e){if(c&&u(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var i=r.parseStackAndMessage(t);a.notEnumerableProp(t,"stack",i.message+"\n"+i.stack.join("\n")),a.notEnumerableProp(t,"__stackCleaned__",!0)}}},e.prototype._warn=function(t){var e=new s(t),n=this._peekContext();if(n)n.attachExtraTrace(e);else{var i=r.parseStackAndMessage(e);e.stack=i.message+"\n"+i.stack.join("\n")}r.formatAndLogError(e,"")},e.onPossiblyUnhandledRejection=function(t){i="function"==typeof t?t:void 0},e.onUnhandledRejectionHandled=function(t){n="function"==typeof t?t:void 0},e.longStackTraces=function(){if(o.haveItemsQueued()&&c===!1)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/DT1qyG\n");c=r.isSupported(),c&&o.disableTrampolineIfNecessary()},e.hasLongStackTraces=function(){return c&&r.isSupported()},r.isSupported()||(e.longStackTraces=function(){},c=!1),function(){return c}}},{"./async.js":2,"./errors.js":13,"./util.js":38}],11:[function(t,e){"use strict";var r=t("./util.js"),n=r.isPrimitive,i=r.wrapsPrimitiveReceiver;e.exports=function(t){var e=function(){return this},r=function(){throw this},o=function(){},s=function(){throw void 0},a=function(t,e){return 1===e?function(){throw t}:2===e?function(){return t}:void 0};t.prototype["return"]=t.prototype.thenReturn=function(t){return void 0===t?this.then(o):i&&n(t)?this._then(a(t,2),void 0,void 0,void 0,void 0):this._then(e,void 0,void 0,t,void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return void 0===t?this.then(s):i&&n(t)?this._then(a(t,1),void 0,void 0,void 0,void 0):this._then(r,void 0,void 0,t,void 0)}}},{"./util.js":38}],12:[function(t,e){"use strict";e.exports=function(t,e){var r=t.reduce;t.prototype.each=function(t){return r(this,t,null,e)},t.each=function(t,n){return r(t,n,null,e)}}},{}],13:[function(t,e){"use strict";function r(t,e){function r(n){return this instanceof r?(l(this,"message","string"==typeof n?n:e),l(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new r(n)}return c(r,Error),r}function n(t){return this instanceof n?(l(this,"name","OperationalError"),l(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(l(this,"message",t.message),l(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new n(t)}var i,o,s=t("./es5.js"),a=s.freeze,u=t("./util.js"),c=u.inherits,l=u.notEnumerableProp,h=r("Warning","warning"),p=r("CancellationError","cancellation error"),f=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,o=RangeError}catch(d){i=r("TypeError","type error"),o=r("RangeError","range error")}for(var v="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),y=0;y<v.length;++y)"function"==typeof Array.prototype[v[y]]&&(_.prototype[v[y]]=Array.prototype[v[y]]);s.defineProperty(_.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),_.prototype.isOperational=!0;var g=0;_.prototype.toString=function(){var t=Array(4*g+1).join(" "),e="\n"+t+"AggregateError of:\n";g++,t=Array(4*g+1).join(" ");for(var r=0;r<this.length;++r){for(var n=this[r]===this?"[Circular AggregateError]":this[r]+"",i=n.split("\n"),o=0;o<i.length;++o)i[o]=t+i[o];n=i.join("\n"),e+=n+"\n"}return g--,e},c(n,Error);var m=Error.__BluebirdErrorTypes__;m||(m=a({CancellationError:p,TimeoutError:f,OperationalError:n,RejectionError:n,AggregateError:_}),l(Error,"__BluebirdErrorTypes__",m)),e.exports={Error:Error,TypeError:i,RangeError:o,CancellationError:m.CancellationError,OperationalError:m.OperationalError,TimeoutError:m.TimeoutError,AggregateError:m.AggregateError,Warning:h}},{"./es5.js":14,"./util.js":38}],14:[function(t,e){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var r=Object.getOwnPropertyDescriptor(t,e);return!(r&&!r.writable&&!r.set)}};else{var n={}.hasOwnProperty,i={}.toString,o={}.constructor.prototype,s=function(t){var e=[];for(var r in t)n.call(t,r)&&e.push(r);return e},a=function(t,e){return{value:t[e]}},u=function(t,e,r){return t[e]=r.value,t},c=function(t){return t},l=function(t){try{return Object(t).constructor.prototype}catch(e){return o}},h=function(t){try{return"[object Array]"===i.call(t)}catch(e){return!1}};e.exports={isArray:h,keys:s,names:s,defineProperty:u,getDescriptor:a,freeze:c,getPrototypeOf:l,isES5:r,propertyIsWritable:function(){return!0}}}},{}],15:[function(t,e){"use strict";e.exports=function(t,e){var r=t.map;t.prototype.filter=function(t,n){return r(this,t,n,e)},t.filter=function(t,n,i){return r(t,n,i,e)}}},{}],16:[function(t,e){"use strict";e.exports=function(e,r,n){function i(){return this}function o(){throw this}function s(t){return function(){return t}}function a(t){return function(){throw t}}function u(t,e,r){var n;return n=p&&f(e)?r?s(e):a(e):r?i:o,t._then(n,_,void 0,e,void 0)}function c(t){var i=this.promise,o=this.handler,s=i._isBound()?o.call(i._boundTo):o();if(void 0!==s){var a=n(s,i);if(a instanceof e)return a=a._target(),u(a,t,i.isFulfilled())}return i.isRejected()?(r.e=t,r):t}function l(t){var r=this.promise,i=this.handler,o=r._isBound()?i.call(r._boundTo,t):i(t);if(void 0!==o){var s=n(o,r);if(s instanceof e)return s=s._target(),u(s,t,!0)}return t}var h=t("./util.js"),p=h.wrapsPrimitiveReceiver,f=h.isPrimitive,_=h.thrower;e.prototype._passThroughHandler=function(t,e){if("function"!=typeof t)return this.then();var r={promise:this,handler:t};return this._then(e?c:l,e?c:void 0,void 0,r,void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThroughHandler(t,!0)},e.prototype.tap=function(t){return this._passThroughHandler(t,!1)}}},{"./util.js":38}],17:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t,r,n){for(var o=0;o<r.length;++o){n._pushContext();var s=h(r[o])(t);if(n._popContext(),s===l){n._pushContext();var a=e.reject(l.e);return n._popContext(),a}var u=i(s,n);if(u instanceof e)return u}return null}function s(t,r,i,o){var s=this._promise=new e(n);s._captureStackTrace(),this._stack=o,this._generatorFunction=t,this._receiver=r,this._generator=void 0,this._yieldHandlers="function"==typeof i?[i].concat(p):p}var a=t("./errors.js"),u=a.TypeError,c=t("./util.js"),l=c.errorObj,h=c.tryCatch,p=[];s.prototype.promise=function(){return this._promise},s.prototype._run=function(){this._generator=this._generatorFunction.call(this._receiver),this._receiver=this._generatorFunction=void 0,this._next(void 0)},s.prototype._continue=function(t){if(t===l)return this._promise._rejectCallback(t.e,!1,!0);var r=t.value;if(t.done===!0)this._promise._resolveCallback(r);else{var n=i(r,this._promise);if(!(n instanceof e)&&(n=o(n,this._yieldHandlers,this._promise),null===n))return void this._throw(new u("A value %s was yielded that could not be treated as a promise\n\n See http://goo.gl/4Y4pDk\n\n".replace("%s",r)+"From coroutine:\n"+this._stack.split("\n").slice(1,-7).join("\n")));n._then(this._next,this._throw,void 0,this,null)}},s.prototype._throw=function(t){this._promise._attachExtraTrace(t),this._promise._pushContext();var e=h(this._generator["throw"]).call(this._generator,t);this._promise._popContext(),this._continue(e)},s.prototype._next=function(t){this._promise._pushContext();var e=h(this._generator.next).call(this._generator,t);this._promise._popContext(),this._continue(e)},e.coroutine=function(t,e){if("function"!=typeof t)throw new u("generatorFunction must be a function\n\n See http://goo.gl/6Vqhm0\n");var r=Object(e).yieldHandler,n=s,i=(new Error).stack;return function(){var e=t.apply(this,arguments),o=new n(void 0,void 0,r,i);return o._generator=e,o._next(void 0),o.promise()}},e.coroutine.addYieldHandler=function(t){if("function"!=typeof t)throw new u("fn must be a function\n\n See http://goo.gl/916lJJ\n");p.push(t)},e.spawn=function(t){if("function"!=typeof t)return r("generatorFunction must be a function\n\n See http://goo.gl/6Vqhm0\n");var n=new s(t,this),i=n.promise();return n._run(e.spawn),i}}},{"./errors.js":13,"./util.js":38}],18:[function(t,e){"use strict";e.exports=function(e,r,n,i){{var o=t("./util.js");o.canEvaluate,o.tryCatch,o.errorObj}e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var n}for(var i=arguments.length,o=new Array(i),s=0;i>s;++s)o[s]=arguments[s];t&&o.pop();var n=new r(o).promise();return void 0!==t?n.spread(t):n}}},{"./util.js":38}],19:[function(t,e){"use strict";e.exports=function(e,r,n,i,o){function s(t,e,r,n){this.constructor$(t),this._promise._captureStackTrace(),this._callback=e,this._preservedValues=n===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=r>=1?[]:_,c.invoke(a,this,void 0)}function a(){this._init$(void 0,-2)}function u(t,e,r,n){var i="object"==typeof r&&null!==r?r.concurrency:0;return i="number"==typeof i&&isFinite(i)&&i>=1?i:0,new s(t,e,i,n)}var c=t("./async.js"),l=t("./util.js"),h=l.tryCatch,p=l.errorObj,f={},_=[];l.inherits(s,r),s.prototype._init=function(){},s.prototype._promiseFulfilled=function(t,r){var n=this._values,o=this.length(),s=this._preservedValues,a=this._limit;if(n[r]===f){if(n[r]=t,a>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return}else{if(a>=1&&this._inFlight>=a)return n[r]=t,void this._queue.push(r);null!==s&&(s[r]=t);var u=this._callback,c=this._promise._boundTo;this._promise._pushContext();var l=h(u).call(c,t,r,o);if(this._promise._popContext(),l===p)return this._reject(l.e);var _=i(l,this._promise);if(_ instanceof e){if(_=_._target(),_._isPending())return a>=1&&this._inFlight++,n[r]=f,_._proxyPromiseArray(this,r);if(!_._isFulfilled())return this._reject(_._reason());l=_._value()}n[r]=l}var d=++this._totalResolved;d>=o&&(null!==s?this._filter(n,s):this._resolve(n))},s.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,r=this._values;t.length>0&&this._inFlight<e;){if(this._isResolved())return;var n=t.pop();this._promiseFulfilled(r[n],n)}},s.prototype._filter=function(t,e){for(var r=e.length,n=new Array(r),i=0,o=0;r>o;++o)t[o]&&(n[i++]=e[o]);n.length=i,this._resolve(n)},s.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return"function"!=typeof t?n("fn must be a function\n\n See http://goo.gl/916lJJ\n"):u(this,t,e,null).promise()},e.map=function(t,e,r,i){return"function"!=typeof e?n("fn must be a function\n\n See http://goo.gl/916lJJ\n"):u(t,e,r,i).promise()}}},{"./async.js":2,"./util.js":38}],20:[function(t,e){"use strict";e.exports=function(e,r,n,i){var o=t("./util.js"),s=o.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("fn must be a function\n\n See http://goo.gl/916lJJ\n");return function(){var n=new e(r);n._captureStackTrace(),n._pushContext();var i=s(t).apply(this,arguments);return n._popContext(),n._resolveFromSyncValue(i),n}},e.attempt=e["try"]=function(t,n,a){if("function"!=typeof t)return i("fn must be a function\n\n See http://goo.gl/916lJJ\n");var u=new e(r);u._captureStackTrace(),u._pushContext();var c=o.isArray(n)?s(t).apply(a,n):s(t).call(a,n);return u._popContext(),u._resolveFromSyncValue(c),u},e.prototype._resolveFromSyncValue=function(t){t===o.errorObj?this._rejectCallback(t.e,!1,!0):this._resolveCallback(t,!0)}}},{"./util.js":38}],21:[function(t,e){"use strict";e.exports=function(e){function r(t,e){var r=this;if(!o.isArray(t))return n.call(r,t,e);var i=a(e).apply(r._boundTo,[null].concat(t));i===u&&s.throwLater(i.e)}function n(t,e){var r=this,n=r._boundTo,i=void 0===t?a(e).call(n,null):a(e).call(n,null,t);i===u&&s.throwLater(i.e)}function i(t,e){var r=this;if(!t){var n=r._target(),i=n._getCarriedStackTrace();i.cause=t,t=i}var o=a(e).call(r._boundTo,t);o===u&&s.throwLater(o.e)}var o=t("./util.js"),s=t("./async.js"),a=o.tryCatch,u=o.errorObj;e.prototype.asCallback=e.prototype.nodeify=function(t,e){if("function"==typeof t){var o=n;void 0!==e&&Object(e).spread&&(o=r),this._then(o,i,void 0,this,t)}return this}}},{"./async.js":2,"./util.js":38}],22:[function(t,e){"use strict";e.exports=function(e,r){var n=t("./util.js"),i=t("./async.js"),o=n.tryCatch,s=n.errorObj;e.prototype.progressed=function(t){return this._then(void 0,void 0,t,void 0,void 0)},e.prototype._progress=function(t){this._isFollowingOrFulfilledOrRejected()||this._target()._progressUnchecked(t)},e.prototype._progressHandlerAt=function(t){return 0===t?this._progressHandler0:this[(t<<2)+t-5+2]},e.prototype._doProgressWith=function(t){var r=t.value,i=t.handler,a=t.promise,u=t.receiver,c=o(i).call(u,r);if(c===s){if(null!=c.e&&"StopProgressPropagation"!==c.e.name){var l=n.canAttachTrace(c.e)?c.e:new Error(n.toString(c.e));a._attachExtraTrace(l),a._progress(c.e)}}else c instanceof e?c._then(a._progress,null,null,a,void 0):a._progress(c)},e.prototype._progressUnchecked=function(t){for(var n=this._length(),o=this._progress,s=0;n>s;s++){var a=this._progressHandlerAt(s),u=this._promiseAt(s);if(u instanceof e)"function"==typeof a?i.invoke(this._doProgressWith,this,{handler:a,promise:u,receiver:this._receiverAt(s),value:t}):i.invoke(o,u,t);else{var c=this._receiverAt(s);"function"==typeof a?a.call(c,t,u):c instanceof r&&!c._isResolved()&&c._promiseProgressed(t,u)}}}}},{"./async.js":2,"./util.js":38}],23:[function(t,e){"use strict";e.exports=function(){function e(t){if("function"!=typeof t)throw new c("the promise constructor requires a resolver function\n\n See http://goo.gl/EC22Yn\n");if(this.constructor!==e)throw new c("the promise constructor cannot be invoked directly\n\n See http://goo.gl/KsIlge\n");this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._progressHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._settledValue=void 0,t!==l&&this._resolveFromResolver(t)}function r(t){var r=new e(l);r._fulfillmentHandler0=t,r._rejectionHandler0=t,r._progressHandler0=t,r._promise0=t,r._receiver0=t,r._settledValue=t}var n=function(){return new c("circular promise resolution chain\n\n See http://goo.gl/LhFpo0\n")},i=function(){return new e.PromiseInspection(this._target())},o=function(t){return e.reject(new c(t))},s=t("./util.js"),a=t("./async.js"),u=t("./errors.js"),c=e.TypeError=u.TypeError;e.RangeError=u.RangeError,e.CancellationError=u.CancellationError,e.TimeoutError=u.TimeoutError,e.OperationalError=u.OperationalError,e.RejectionError=u.OperationalError,e.AggregateError=u.AggregateError;var l=function(){},h={},p={e:null},f=t("./thenables.js")(e,l),_=t("./promise_array.js")(e,l,f,o),d=t("./captured_trace.js")(),v=t("./debuggability.js")(e,d),y=t("./context.js")(e,d,v),g=t("./catch_filter.js")(p),m=t("./promise_resolver.js"),j=m._nodebackForPromise,b=s.errorObj,w=s.tryCatch;return e.prototype.toString=function(){return"[object Promise]"},e.prototype.caught=e.prototype["catch"]=function(t){var r=arguments.length;if(r>1){var n,i=new Array(r-1),o=0;for(n=0;r-1>n;++n){var s=arguments[n];if("function"!=typeof s)return e.reject(new c("Catch filter must inherit from Error or be a simple predicate function\n\n See http://goo.gl/o84o68\n"));i[o++]=s}i.length=o,t=arguments[n];var a=new g(i,t,this);return this._then(void 0,a.doFilter,void 0,a,void 0)}return this._then(void 0,t,void 0,void 0,void 0)},e.prototype.reflect=function(){return this._then(i,i,void 0,this,void 0)},e.prototype.then=function(t,e,r){if(v()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+s.classString(t);arguments.length>1&&(n+=", "+s.classString(e)),this._warn(n)}return this._then(t,e,r,void 0,void 0)},e.prototype.done=function(t,e,r){var n=this._then(t,e,r,void 0,void 0);n._setIsFinal()},e.prototype.spread=function(t,e){return this.all()._then(t,e,void 0,h,void 0)},e.prototype.isCancellable=function(){return!this.isResolved()&&this._cancellable()
+},e.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},e.prototype.all=function(){return new _(this).promise()},e.prototype.error=function(t){return this.caught(s.originatesFromRejection,t)},e.is=function(t){return t instanceof e},e.fromNode=function(t){var r=new e(l),n=w(t)(j(r));return n===b&&r._rejectCallback(n.e,!0,!0),r},e.all=function(t){return new _(t).promise()},e.defer=e.pending=function(){var t=new e(l);return new m(t)},e.cast=function(t){var r=f(t);if(!(r instanceof e)){var n=r;r=new e(l),r._fulfillUnchecked(n)}return r},e.resolve=e.fulfilled=e.cast,e.reject=e.rejected=function(t){var r=new e(l);return r._captureStackTrace(),r._rejectCallback(t,!0),r},e.setScheduler=function(t){if("function"!=typeof t)throw new c("fn must be a function\n\n See http://goo.gl/916lJJ\n");var e=a._schedule;return a._schedule=t,e},e.prototype._then=function(t,r,n,i,o){var s=void 0!==o,u=s?o:new e(l);s||(u._propagateFrom(this,5),u._captureStackTrace());var c=this._target();c!==this&&(void 0===i&&(i=this._boundTo),s||u._setIsMigrated());var h=c._addCallbacks(t,r,n,u,i);return c._isResolved()&&!c._isSettlePromisesQueued()&&a.invoke(c._settlePromiseAtPostResolution,c,h),u},e.prototype._settlePromiseAtPostResolution=function(t){this._isRejectionUnhandled()&&this._unsetRejectionIsUnhandled(),this._settlePromiseAt(t)},e.prototype._length=function(){return 131071&this._bitField},e.prototype._isFollowingOrFulfilledOrRejected=function(){return(939524096&this._bitField)>0},e.prototype._isFollowing=function(){return 536870912===(536870912&this._bitField)},e.prototype._setLength=function(t){this._bitField=-131072&this._bitField|131071&t},e.prototype._setFulfilled=function(){this._bitField=268435456|this._bitField},e.prototype._setRejected=function(){this._bitField=134217728|this._bitField},e.prototype._setFollowing=function(){this._bitField=536870912|this._bitField},e.prototype._setIsFinal=function(){this._bitField=33554432|this._bitField},e.prototype._isFinal=function(){return(33554432&this._bitField)>0},e.prototype._cancellable=function(){return(67108864&this._bitField)>0},e.prototype._setCancellable=function(){this._bitField=67108864|this._bitField},e.prototype._unsetCancellable=function(){this._bitField=-67108865&this._bitField},e.prototype._setIsMigrated=function(){this._bitField=4194304|this._bitField},e.prototype._unsetIsMigrated=function(){this._bitField=-4194305&this._bitField},e.prototype._isMigrated=function(){return(4194304&this._bitField)>0},e.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[5*t-5+4];return void 0===e&&this._isBound()?this._boundTo:e},e.prototype._promiseAt=function(t){return 0===t?this._promise0:this[5*t-5+3]},e.prototype._fulfillmentHandlerAt=function(t){return 0===t?this._fulfillmentHandler0:this[5*t-5+0]},e.prototype._rejectionHandlerAt=function(t){return 0===t?this._rejectionHandler0:this[5*t-5+1]},e.prototype._migrateCallbacks=function(t,r){var n=t._fulfillmentHandlerAt(r),i=t._rejectionHandlerAt(r),o=t._progressHandlerAt(r),s=t._promiseAt(r),a=t._receiverAt(r);s instanceof e&&s._setIsMigrated(),this._addCallbacks(n,i,o,s,a)},e.prototype._addCallbacks=function(t,e,r,n,i){var o=this._length();if(o>=131066&&(o=0,this._setLength(0)),0===o)this._promise0=n,void 0!==i&&(this._receiver0=i),"function"!=typeof t||this._isCarryingStackTrace()||(this._fulfillmentHandler0=t),"function"==typeof e&&(this._rejectionHandler0=e),"function"==typeof r&&(this._progressHandler0=r);else{var s=5*o-5;this[s+3]=n,this[s+4]=i,"function"==typeof t&&(this[s+0]=t),"function"==typeof e&&(this[s+1]=e),"function"==typeof r&&(this[s+2]=r)}return this._setLength(o+1),o},e.prototype._setProxyHandlers=function(t,e){var r=this._length();if(r>=131066&&(r=0,this._setLength(0)),0===r)this._promise0=e,this._receiver0=t;else{var n=5*r-5;this[n+3]=e,this[n+4]=t}this._setLength(r+1)},e.prototype._proxyPromiseArray=function(t,e){this._setProxyHandlers(t,e)},e.prototype._resolveCallback=function(t,r){if(!this._isFollowingOrFulfilledOrRejected()){if(t===this)return this._rejectCallback(n(),!1,!0);var i=f(t,this);if(!(i instanceof e))return this._fulfill(t);var o=1|(r?4:0);this._propagateFrom(i,o);var s=i._target();if(s._isPending()){for(var a=this._length(),u=0;a>u;++u)s._migrateCallbacks(this,u);this._setFollowing(),this._setLength(0),this._setFollowee(s)}else s._isFulfilled()?this._fulfillUnchecked(s._value()):this._rejectUnchecked(s._reason(),s._getCarriedStackTrace())}},e.prototype._rejectCallback=function(t,e,r){r||s.markAsOriginatingFromRejection(t);var n=s.ensureErrorObject(t),i=n===t;this._attachExtraTrace(n,e?i:!1),this._reject(t,i?void 0:n)},e.prototype._resolveFromResolver=function(t){var e=this;this._captureStackTrace(),this._pushContext();var r=!0,n=w(t)(function(t){null!==e&&(e._resolveCallback(t),e=null)},function(t){null!==e&&(e._rejectCallback(t,r),e=null)});r=!1,this._popContext(),void 0!==n&&n===b&&null!==e&&(e._rejectCallback(n.e,!0,!0),e=null)},e.prototype._settlePromiseFromHandler=function(t,e,r,i){if(!i._isRejected()){i._pushContext();var o;if(o=e!==h||this._isRejected()?w(t).call(e,r):w(t).apply(this._boundTo,r),i._popContext(),o===b||o===i||o===p){var s=o===i?n():o.e;i._rejectCallback(s,!1,!0)}else i._resolveCallback(o)}},e.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},e.prototype._followee=function(){return this._rejectionHandler0},e.prototype._setFollowee=function(t){this._rejectionHandler0=t},e.prototype._cleanValues=function(){this._cancellable()&&(this._cancellationParent=void 0)},e.prototype._propagateFrom=function(t,e){(1&e)>0&&t._cancellable()&&(this._setCancellable(),this._cancellationParent=t),(4&e)>0&&t._isBound()&&this._setBoundTo(t._boundTo)},e.prototype._fulfill=function(t){this._isFollowingOrFulfilledOrRejected()||this._fulfillUnchecked(t)},e.prototype._reject=function(t,e){this._isFollowingOrFulfilledOrRejected()||this._rejectUnchecked(t,e)},e.prototype._settlePromiseAt=function(t){var r=this._promiseAt(t),n=r instanceof e;if(n&&r._isMigrated())return r._unsetIsMigrated(),a.invoke(this._settlePromiseAt,this,t);var i=this._isFulfilled()?this._fulfillmentHandlerAt(t):this._rejectionHandlerAt(t),o=this._isCarryingStackTrace()?this._getCarriedStackTrace():void 0,s=this._settledValue,u=this._receiverAt(t);this._clearCallbackDataAtIndex(t),"function"==typeof i?n?this._settlePromiseFromHandler(i,u,s,r):i.call(u,s,r):u instanceof _?u._isResolved()||(this._isFulfilled()?u._promiseFulfilled(s,r):u._promiseRejected(s,r)):n&&(this._isFulfilled()?r._fulfill(s):r._reject(s,o)),t>=4&&4===(31&t)&&a.invokeLater(this._setLength,this,0)},e.prototype._clearCallbackDataAtIndex=function(t){if(0===t)this._isCarryingStackTrace()||(this._fulfillmentHandler0=void 0),this._rejectionHandler0=this._progressHandler0=this._receiver0=this._promise0=void 0;else{var e=5*t-5;this[e+3]=this[e+4]=this[e+0]=this[e+1]=this[e+2]=void 0}},e.prototype._isSettlePromisesQueued=function(){return-1073741824===(-1073741824&this._bitField)},e.prototype._setSettlePromisesQueued=function(){this._bitField=-1073741824|this._bitField},e.prototype._unsetSettlePromisesQueued=function(){this._bitField=1073741823&this._bitField},e.prototype._queueSettlePromises=function(){a.settlePromises(this),this._setSettlePromisesQueued()},e.prototype._fulfillUnchecked=function(t){if(t===this){var e=n();return this._attachExtraTrace(e),this._rejectUnchecked(e,void 0)}this._setFulfilled(),this._settledValue=t,this._cleanValues(),this._length()>0&&this._queueSettlePromises()},e.prototype._rejectUncheckedCheckError=function(t){var e=s.ensureErrorObject(t);this._rejectUnchecked(t,e===t?void 0:e)},e.prototype._rejectUnchecked=function(t,e){if(t===this){var r=n();return this._attachExtraTrace(r),this._rejectUnchecked(r)}return this._setRejected(),this._settledValue=t,this._cleanValues(),this._isFinal()?void a.throwLater(function(t){throw"stack"in t&&a.invokeFirst(d.unhandledRejection,void 0,t),t},void 0===e?t:e):(void 0!==e&&e!==t&&this._setCarriedStackTrace(e),void(this._length()>0?this._queueSettlePromises():this._ensurePossibleRejectionHandled()))},e.prototype._settlePromises=function(){this._unsetSettlePromisesQueued();for(var t=this._length(),e=0;t>e;e++)this._settlePromiseAt(e)},e._makeSelfResolutionError=n,t("./progress.js")(e,_),t("./method.js")(e,l,f,o),t("./bind.js")(e,l,f),t("./finally.js")(e,p,f),t("./direct_resolve.js")(e),t("./synchronous_inspection.js")(e),t("./join.js")(e,_,f,l),e.Promise=e,t("./map.js")(e,_,o,f,l),t("./cancel.js")(e),t("./using.js")(e,o,f,y),t("./generators.js")(e,o,l,f),t("./nodeify.js")(e),t("./call_get.js")(e),t("./props.js")(e,_,f,o),t("./race.js")(e,l,f,o),t("./reduce.js")(e,_,o,f,l),t("./settle.js")(e,_),t("./some.js")(e,_,o),t("./promisify.js")(e,l),t("./any.js")(e),t("./each.js")(e,l),t("./timers.js")(e,l),t("./filter.js")(e,l),s.toFastProperties(e),s.toFastProperties(e.prototype),r({a:1}),r({b:2}),r({c:3}),r(1),r(function(){}),r(void 0),r(!1),r(new e(l)),d.setBounds(a.firstLineError,s.lastLineError),e}},{"./any.js":1,"./async.js":2,"./bind.js":3,"./call_get.js":5,"./cancel.js":6,"./captured_trace.js":7,"./catch_filter.js":8,"./context.js":9,"./debuggability.js":10,"./direct_resolve.js":11,"./each.js":12,"./errors.js":13,"./filter.js":15,"./finally.js":16,"./generators.js":17,"./join.js":18,"./map.js":19,"./method.js":20,"./nodeify.js":21,"./progress.js":22,"./promise_array.js":24,"./promise_resolver.js":25,"./promisify.js":26,"./props.js":27,"./race.js":29,"./reduce.js":30,"./settle.js":32,"./some.js":33,"./synchronous_inspection.js":34,"./thenables.js":35,"./timers.js":36,"./using.js":37,"./util.js":38}],24:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){switch(t){case-2:return[];case-3:return{}}}function s(t){var n,i=this._promise=new e(r);t instanceof e&&(n=t,i._propagateFrom(n,5)),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var a=t("./util.js"),u=a.isArray;return s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function c(t,r){var s=n(this._values,this._promise);if(s instanceof e){if(s=s._target(),this._values=s,!s._isFulfilled())return s._isPending()?void s._then(c,this._reject,void 0,this,r):void this._reject(s._reason());if(s=s._value(),!u(s)){var a=new e.TypeError("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n");return void this.__hardReject__(a)}}else if(!u(s))return void this._promise._reject(i("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n")._reason());if(0===s.length)return void(-5===r?this._resolveEmptyArray():this._resolve(o(r)));var l=this.getActualLength(s.length);this._length=l,this._values=this.shouldCopyValues()?new Array(l):this._values;for(var h=this._promise,p=0;l>p;++p){var f=this._isResolved(),_=n(s[p],h);_ instanceof e?(_=_._target(),f?_._unsetRejectionIsUnhandled():_._isPending()?_._proxyPromiseArray(this,p):_._isFulfilled()?this._promiseFulfilled(_._value(),p):this._promiseRejected(_._reason(),p)):f||this._promiseFulfilled(_,p)}},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype.__hardReject__=s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1,!0)},s.prototype._promiseProgressed=function(t,e){this._promise._progress({index:e,value:t})},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var r=++this._totalResolved;r>=this._length&&this._resolve(this._values)},s.prototype._promiseRejected=function(t){this._totalResolved++,this._reject(t)},s.prototype.shouldCopyValues=function(){return!0},s.prototype.getActualLength=function(t){return t},s}},{"./util.js":38}],25:[function(t,e){"use strict";function r(t){return t instanceof Error&&p.getPrototypeOf(t)===Error.prototype}function n(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=p.keys(t),i=0;i<n.length;++i){var o=n[i];f.test(o)||(e[o]=t[o])}return e}return s.markAsOriginatingFromRejection(t),t}function i(t){return function(e,r){if(null!==t){if(e){var i=n(a(e));t._attachExtraTrace(i),t._reject(i)}else if(arguments.length>2){for(var o=arguments.length,s=new Array(o-1),u=1;o>u;++u)s[u-1]=arguments[u];t._fulfill(s)}else t._fulfill(r);t=null}}}var o,s=t("./util.js"),a=s.maybeWrapAsError,u=t("./errors.js"),c=u.TimeoutError,l=u.OperationalError,h=s.haveGetters,p=t("./es5.js"),f=/^(?:name|message|stack|cause)$/;if(o=h?function(t){this.promise=t}:function(t){this.promise=t,this.asCallback=i(t),this.callback=this.asCallback},h){var _={get:function(){return i(this.promise)}};p.defineProperty(o.prototype,"asCallback",_),p.defineProperty(o.prototype,"callback",_)}o._nodebackForPromise=i,o.prototype.toString=function(){return"[object PromiseResolver]"},o.prototype.resolve=o.prototype.fulfill=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._resolveCallback(t)},o.prototype.reject=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._rejectCallback(t)},o.prototype.progress=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._progress(t)},o.prototype.cancel=function(t){this.promise.cancel(t)},o.prototype.timeout=function(){this.reject(new c("timeout"))},o.prototype.isResolved=function(){return this.promise.isResolved()},o.prototype.toJSON=function(){return this.promise.toJSON()},e.exports=o},{"./errors.js":13,"./es5.js":14,"./util.js":38}],26:[function(t,e){"use strict";e.exports=function(e,r){function n(t){return!b.test(t)}function i(t){try{return t.__isPromisified__===!0}catch(e){return!1}}function o(t,e,r){var n=f.getDataPropertyOrDefault(t,e+r,j);return n?i(n):!1}function s(t,e,r){for(var n=0;n<t.length;n+=2){var i=t[n];if(r.test(i))for(var o=i.replace(r,""),s=0;s<t.length;s+=2)if(t[s]===o)throw new g("Cannot promisify an API that has normal methods with '%s'-suffix\n\n See http://goo.gl/iWrZbw\n".replace("%s",e))}}function a(t,e,r,n){for(var a=f.inheritedDataKeys(t),u=[],c=0;c<a.length;++c){var l=a[c],h=t[l],p=n===w?!0:w(l,h,t);"function"!=typeof h||i(h)||o(t,l,e)||!n(l,h,t,p)||u.push(l,h)}return s(u,e,r),u}function u(t,n,i,o){function s(){var i=n;n===p&&(i=this);var o=new e(r);o._captureStackTrace();var s="string"==typeof u&&this!==a?this[u]:t,c=_(o);try{s.apply(i,d(arguments,c))}catch(l){o._rejectCallback(v(l),!0,!0)}return o}var a=function(){return this}(),u=t;return"string"==typeof u&&(t=o),s.__isPromisified__=!0,s}function c(t,e,r,n){for(var i=new RegExp(k(e)+"$"),o=a(t,e,i,r),s=0,u=o.length;u>s;s+=2){var c=o[s],l=o[s+1],h=c+e;t[h]=n===E?E(c,p,c,l,e):n(l,function(){return E(c,p,c,l,e)})}return f.toFastProperties(t),t}function l(t,e){return E(t,e,void 0,t)}var h,p={},f=t("./util.js"),_=t("./promise_resolver.js")._nodebackForPromise,d=f.withAppended,v=f.maybeWrapAsError,y=f.canEvaluate,g=t("./errors").TypeError,m="Async",j={__isPromisified__:!0},b=/^(?:length|name|arguments|caller|callee|prototype|__isPromisified__)$/,w=function(t,e){return f.isIdentifier(t)&&"_"!==t.charAt(0)&&!f.isClass(e)},k=function(t){return t.replace(/([$])/,"\\$")},E=y?h:u;e.promisify=function(t,e){if("function"!=typeof t)throw new g("fn must be a function\n\n See http://goo.gl/916lJJ\n");if(i(t))return t;var r=l(t,arguments.length<2?p:e);return f.copyDescriptors(t,r,n),r},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/9ITlV0\n");e=Object(e);var r=e.suffix;"string"!=typeof r&&(r=m);var n=e.filter;"function"!=typeof n&&(n=w);var i=e.promisifier;if("function"!=typeof i&&(i=E),!f.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/8FZo5V\n");for(var o=f.inheritedDataKeys(t),s=0;s<o.length;++s){var a=t[o[s]];"constructor"!==o[s]&&f.isClass(a)&&(c(a.prototype,r,n,i),c(a,r,n,i))}return c(t,r,n,i)}}},{"./errors":13,"./promise_resolver.js":25,"./util.js":38}],27:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){for(var e=c.keys(t),r=e.length,n=new Array(2*r),i=0;r>i;++i){var o=e[i];n[i]=t[o],n[i+r]=o}this.constructor$(n)}function s(t){var r,s=n(t);return u(s)?(r=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&r._propagateFrom(s,4),r):i("cannot await properties of a non-object\n\n See http://goo.gl/OsFKC8\n")}var a=t("./util.js"),u=a.isObject,c=t("./es5.js");a.inherits(o,r),o.prototype._init=function(){this._init$(void 0,-3)},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var r=++this._totalResolved;if(r>=this._length){for(var n={},i=this.length(),o=0,s=this.length();s>o;++o)n[this._values[o+i]]=this._values[o];this._resolve(n)}},o.prototype._promiseProgressed=function(t,e){this._promise._progress({key:this._values[e+this.length()],value:t})},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5.js":14,"./util.js":38}],28:[function(t,e){"use strict";function r(t,e,r,n,i){for(var o=0;i>o;++o)r[o+n]=t[o+e],t[o+e]=void 0}function n(t){this._capacity=t,this._length=0,this._front=0}n.prototype._willBeOverCapacity=function(t){return this._capacity<t},n.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var r=this._front+e&this._capacity-1;this[r]=t,this._length=e+1},n.prototype._unshiftOne=function(t){var e=this._capacity;this._checkCapacity(this.length()+1);var r=this._front,n=(r-1&e-1^e)-e;this[n]=t,this._front=n,this._length=this.length()+1},n.prototype.unshift=function(t,e,r){this._unshiftOne(r),this._unshiftOne(e),this._unshiftOne(t)},n.prototype.push=function(t,e,r){var n=this.length()+3;if(this._willBeOverCapacity(n))return this._pushOne(t),this._pushOne(e),void this._pushOne(r);var i=this._front+n-3;this._checkCapacity(n);var o=this._capacity-1;this[i+0&o]=t,this[i+1&o]=e,this[i+2&o]=r,this._length=n},n.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},n.prototype.length=function(){return this._length},n.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},n.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,i=this._length,o=n+i&e-1;r(this,0,this,e,o)},e.exports=n},{}],29:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t,o){var u=n(t);if(u instanceof e)return a(u);if(!s(t))return i("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n");var c=new e(r);void 0!==o&&c._propagateFrom(o,5);for(var l=c._fulfill,h=c._reject,p=0,f=t.length;f>p;++p){var _=t[p];(void 0!==_||p in t)&&e.cast(_)._then(l,h,void 0,c,null)}return c}var s=t("./util.js").isArray,a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util.js":38}],30:[function(t,e){"use strict";e.exports=function(e,r,n,i,o){function s(t,r,n,s){this.constructor$(t),this._promise._captureStackTrace(),this._preservedValues=s===o?[]:null,this._zerothIsAccum=void 0===n,this._gotAccum=!1,this._reducingIndex=this._zerothIsAccum?1:0,this._valuesPhase=void 0;var u=i(n,this._promise),l=!1,h=u instanceof e;h&&(u=u._target(),u._isPending()?u._proxyPromiseArray(this,-1):u._isFulfilled()?(n=u._value(),this._gotAccum=!0):(this._reject(u._reason()),l=!0)),h||this._zerothIsAccum||(this._gotAccum=!0),this._callback=r,this._accum=n,l||c.invoke(a,this,void 0)}function a(){this._init$(void 0,-5)}function u(t,e,r,i){if("function"!=typeof e)return n("fn must be a function\n\n See http://goo.gl/916lJJ\n");var o=new s(t,e,r,i);return o.promise()}var c=t("./async.js"),l=t("./util.js"),h=l.tryCatch,p=l.errorObj;l.inherits(s,r),s.prototype._init=function(){},s.prototype._resolveEmptyArray=function(){(this._gotAccum||this._zerothIsAccum)&&this._resolve(null!==this._preservedValues?[]:this._accum)},s.prototype._promiseFulfilled=function(t,r){var n=this._values;n[r]=t;var o,s=this.length(),a=this._preservedValues,u=null!==a,c=this._gotAccum,l=this._valuesPhase;if(!l)for(l=this._valuesPhase=new Array(s),o=0;s>o;++o)l[o]=0;if(o=l[r],0===r&&this._zerothIsAccum?(this._accum=t,this._gotAccum=c=!0,l[r]=0===o?1:2):-1===r?(this._accum=t,this._gotAccum=c=!0):0===o?l[r]=1:(l[r]=2,this._accum=t),c){for(var f,_=this._callback,d=this._promise._boundTo,v=this._reducingIndex;s>v;++v)if(o=l[v],2!==o){if(1!==o)return;if(t=n[v],this._promise._pushContext(),u?(a.push(t),f=h(_).call(d,t,v,s)):f=h(_).call(d,this._accum,t,v,s),this._promise._popContext(),f===p)return this._reject(f.e);var y=i(f,this._promise);if(y instanceof e){if(y=y._target(),y._isPending())return l[v]=4,y._proxyPromiseArray(this,v);if(!y._isFulfilled())return this._reject(y._reason());f=y._value()}this._reducingIndex=v+1,this._accum=f}else this._reducingIndex=v+1;this._resolve(u?a:this._accum)}},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,r,n){return u(t,e,r,n)}}},{"./async.js":2,"./util.js":38}],31:[function(t,e){"use strict";var r,n=function(){throw new Error("No async scheduler available\n\n See http://goo.gl/m3OTXk\n")};if(t("./util.js").isNode){var i=process.versions.node.split(".").map(Number);r=0===i[0]&&i[1]>10||i[0]>0?function(t){global.setImmediate(t)}:process.nextTick,r||(r="undefined"!=typeof setImmediate?setImmediate:"undefined"!=typeof setTimeout?setTimeout:n)}else"undefined"!=typeof MutationObserver?(r=function(t){var e=document.createElement("div"),r=new MutationObserver(t);return r.observe(e,{attributes:!0}),function(){e.classList.toggle("foo")}},r.isStatic=!0):r="undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:n;e.exports=r},{"./util.js":38}],32:[function(t,e){"use strict";e.exports=function(e,r){function n(t){this.constructor$(t)}var i=e.PromiseInspection,o=t("./util.js");o.inherits(n,r),n.prototype._promiseResolved=function(t,e){this._values[t]=e;var r=++this._totalResolved;r>=this._length&&this._resolve(this._values)},n.prototype._promiseFulfilled=function(t,e){var r=new i;r._bitField=268435456,r._settledValue=t,this._promiseResolved(e,r)},n.prototype._promiseRejected=function(t,e){var r=new i;r._bitField=134217728,r._settledValue=t,this._promiseResolved(e,r)},e.settle=function(t){return new n(t).promise()},e.prototype.settle=function(){return new n(this).promise()}}},{"./util.js":38}],33:[function(t,e){"use strict";e.exports=function(e,r,n){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return n("expecting a positive integer\n\n See http://goo.gl/1wAmHx\n");var r=new i(t),o=r.promise();return r.setHowMany(e),r.init(),o}var s=t("./util.js"),a=t("./errors.js").RangeError,u=t("./errors.js").AggregateError,c=s.isArray;s.inherits(i,r),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=c(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){this._addFulfilled(t),this._fulfilled()===this.howMany()&&(this._values.length=this.howMany(),this._resolve(1===this.howMany()&&this._unwrap?this._values[0]:this._values))},i.prototype._promiseRejected=function(t){if(this._addRejected(t),this.howMany()>this._canPossiblyFulfill()){for(var e=new u,r=this.length();r<this._values.length;++r)e.push(this._values[r]);this._reject(e)}},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors.js":13,"./util.js":38}],34:[function(t,e){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValue=t._settledValue):(this._bitField=0,this._settledValue=void 0)}e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/hc1DLj\n");return this._settledValue},e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/hPuiwB\n");return this._settledValue},e.prototype.isFulfilled=t.prototype._isFulfilled=function(){return(268435456&this._bitField)>0},e.prototype.isRejected=t.prototype._isRejected=function(){return(134217728&this._bitField)>0},e.prototype.isPending=t.prototype._isPending=function(){return 0===(402653184&this._bitField)},e.prototype.isResolved=t.prototype._isResolved=function(){return(402653184&this._bitField)>0},t.prototype.isPending=function(){return this._target()._isPending()},t.prototype.isRejected=function(){return this._target()._isRejected()},t.prototype.isFulfilled=function(){return this._target()._isFulfilled()},t.prototype.isResolved=function(){return this._target()._isResolved()},t.prototype._value=function(){return this._settledValue},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue},t.prototype.value=function(){var t=this._target();if(!t.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/hc1DLj\n");return t._settledValue},t.prototype.reason=function(){var t=this._target();if(!t.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/hPuiwB\n");return t._unsetRejectionIsUnhandled(),t._settledValue},t.PromiseInspection=e}},{}],35:[function(t,e){"use strict";e.exports=function(e,r){function n(t,n){if(c(t)){if(t instanceof e)return t;if(o(t)){var l=new e(r);return t._then(l._fulfillUnchecked,l._rejectUncheckedCheckError,l._progressUnchecked,l,null),l}var h=a.tryCatch(i)(t);if(h===u){n&&n._pushContext();var l=e.reject(h.e);return n&&n._popContext(),l}if("function"==typeof h)return s(t,h,n)}return t}function i(t){return t.then}function o(t){return l.call(t,"_promise0")}function s(t,n,i){function o(r){l&&(t===r?l._rejectCallback(e._makeSelfResolutionError(),!1,!0):l._resolveCallback(r),l=null)}function s(t){l&&(l._rejectCallback(t,p,!0),l=null)}function c(t){l&&"function"==typeof l._progress&&l._progress(t)}var l=new e(r),h=l;i&&i._pushContext(),l._captureStackTrace(),i&&i._popContext();var p=!0,f=a.tryCatch(n).call(t,o,s,c);return p=!1,l&&f===u&&(l._rejectCallback(f.e,!0,!0),l=null),h}var a=t("./util.js"),u=a.errorObj,c=a.isObject,l={}.hasOwnProperty;return n}},{"./util.js":38}],36:[function(t,e){"use strict";e.exports=function(e,r){function n(t){var e=this;return e instanceof Number&&(e=+e),clearTimeout(e),t}function i(t){var e=this;throw e instanceof Number&&(e=+e),clearTimeout(e),t}var o=t("./util.js"),s=e.TimeoutError,a=function(t,e){if(t.isPending()){"string"!=typeof e&&(e="operation timed out");var r=new s(e);o.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._cancel(r)}},u=function(t){return c(+this).thenReturn(t)},c=e.delay=function(t,n){if(void 0===n){n=t,t=void 0;var i=new e(r);return setTimeout(function(){i._fulfill()},n),i}return n=+n,e.resolve(t)._then(u,null,null,n,void 0)};e.prototype.delay=function(t){return c(this,t)},e.prototype.timeout=function(t,e){t=+t;var r=this.then().cancellable();r._cancellationParent=this;var o=setTimeout(function(){a(r,e)},t);return r._then(n,i,void 0,o,void 0)}}},{"./util.js":38}],37:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){for(var r=t.length,n=0;r>n;++n){var i=t[n];if(i.isRejected())return e.reject(i.error());t[n]=i._settledValue}return t}function s(t){setTimeout(function(){throw t},0)}function a(t){var e=n(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,r){function i(){if(o>=u)return c.resolve();var l=a(t[o++]);if(l instanceof e&&l._isDisposable()){try{l=n(l._getDisposer().tryDispose(r),t.promise)}catch(h){return s(h)}if(l instanceof e)return l._then(i,s,null,null,null)}i()}var o=0,u=t.length,c=e.defer();return i(),c.promise}function c(t){var e=new v;return e._settledValue=t,e._bitField=268435456,u(this,e).thenReturn(t)}function l(t){var e=new v;return e._settledValue=t,e._bitField=134217728,u(this,e).thenThrow(t)}function h(t,e,r){this._data=t,this._promise=e,this._context=r}function p(t,e,r){this.constructor$(t,e,r)}function f(t){return h.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}var _=t("./errors.js").TypeError,d=t("./util.js").inherits,v=e.PromiseInspection;h.prototype.data=function(){return this._data},h.prototype.promise=function(){return this._promise},h.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():null},h.prototype.tryDispose=function(t){var e=this.resource(),r=this._context;void 0!==r&&r._pushContext();var n=null!==e?this.doDispose(e,t):null;return void 0!==r&&r._popContext(),this._promise._unsetDisposable(),this._data=null,n},h.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},d(p,h),p.prototype.doDispose=function(t,e){var r=this.data();return r.call(t,t,e)},e.using=function(){var t=arguments.length;if(2>t)return r("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return r("fn must be a function\n\n See http://goo.gl/916lJJ\n");t--;for(var s=new Array(t),a=0;t>a;++a){var u=arguments[a];if(h.isDisposer(u)){var p=u;u=u.promise(),u._setDisposable(p)}else{var _=n(u);_ instanceof e&&(u=_._then(f,null,null,{resources:s,index:a},void 0))}s[a]=u}var d=e.settle(s).then(o).then(function(t){d._pushContext();var e;try{e=i.apply(void 0,t)}finally{d._popContext()}return e})._then(c,l,void 0,s,void 0);return s.promise=d,d},e.prototype._setDisposable=function(t){this._bitField=262144|this._bitField,this._disposer=t},e.prototype._isDisposable=function(){return(262144&this._bitField)>0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-262145&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new _}}},{"./errors.js":13,"./util.js":38}],38:[function(t,e,r){"use strict";
+function n(){try{return T.apply(this,arguments)}catch(t){return F.e=t,F}}function i(t){return T=t,n}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return!o(t)}function a(t){return o(t)?new Error(v(t)):t}function u(t,e){var r,n=t.length,i=new Array(n+1);for(r=0;n>r;++r)i[r]=t[r];return i[r]=e,i}function c(t,e,r){if(!w.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var n=Object.getOwnPropertyDescriptor(t,e);return null!=n?null==n.get&&null==n.set?n.value:r:void 0}function l(t,e,r){if(o(t))return t;var n={value:r,configurable:!0,enumerable:!1,writable:!0};return w.defineProperty(t,e,n),t}function h(t){throw t}function p(t){try{if("function"==typeof t){var e=w.names(t.prototype);return w.isES5?e.length>1:e.length>0&&!(1===e.length&&"constructor"===e[0])}return!1}catch(r){return!1}}function f(t){function e(){}e.prototype=t;for(var r=8;r--;)new e;return t}function _(t){return R.test(t)}function d(t,e,r){for(var n=new Array(t),i=0;t>i;++i)n[i]=e+i+r;return n}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){try{l(t,"isOperational",!0)}catch(e){}}function g(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function m(t){return t instanceof Error&&w.propertyIsWritable(t,"stack")}function j(t){return{}.toString.call(t)}function b(t,e,r){for(var n=w.names(t),i=0;i<n.length;++i){var o=n[i];r(o)&&w.defineProperty(e,o,w.getDescriptor(t,o))}}var w=t("./es5.js"),k="undefined"==typeof navigator,E=function(){try{var t={};return w.defineProperty(t,"f",{get:function(){return 3}}),3===t.f}catch(e){return!1}}(),F={e:{}},T,C=function(t,e){function r(){this.constructor=t,this.constructor$=e;for(var r in e.prototype)n.call(e.prototype,r)&&"$"!==r.charAt(r.length-1)&&(this[r+"$"]=e.prototype[r])}var n={}.hasOwnProperty;return r.prototype=e.prototype,t.prototype=new r,t.prototype},x=function(){return"string"!==this}.call("string"),P=function(){if(w.isES5){var t=Object.prototype,e=Object.getOwnPropertyNames;return function(r){for(var n=[],i=Object.create(null);null!=r&&r!==t;){var o;try{o=e(r)}catch(s){return n}for(var a=0;a<o.length;++a){var u=o[a];if(!i[u]){i[u]=!0;var c=Object.getOwnPropertyDescriptor(r,u);null!=c&&null==c.get&&null==c.set&&n.push(u)}}r=w.getPrototypeOf(r)}return n}}return function(t){var e=[];for(var r in t)e.push(r);return e}}(),R=/^[a-z$_][a-z$_0-9]*$/i,A=function(){return"stack"in new Error?function(t){return m(t)?t:new Error(v(t))}:function(t){if(m(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),S={isClass:p,isIdentifier:_,inheritedDataKeys:P,getDataPropertyOrDefault:c,thrower:h,isArray:w.isArray,haveGetters:E,notEnumerableProp:l,isPrimitive:o,isObject:s,canEvaluate:k,errorObj:F,tryCatch:i,inherits:C,withAppended:u,maybeWrapAsError:a,wrapsPrimitiveReceiver:x,toFastProperties:f,filledRange:d,toString:v,canAttachTrace:m,ensureErrorObject:A,originatesFromRejection:g,markAsOriginatingFromRejection:y,classString:j,copyDescriptors:b,hasDevTools:"undefined"!=typeof chrome&&chrome&&"function"==typeof chrome.loadTimes,isNode:"undefined"!=typeof process&&"[object process]"===j(process).toLowerCase()};try{throw new Error}catch(O){S.lastLineError=O}e.exports=S},{"./es5.js":14}],39:[function(t,e){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return"function"==typeof t}function i(t){return"number"==typeof t}function o(t){return"object"==typeof t&&null!==t}function s(t){return void 0===t}e.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(t){if(!i(t)||0>t||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},r.prototype.emit=function(t){var e,r,i,a,u,c;if(this._events||(this._events={}),"error"===t&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(e=arguments[1],e instanceof Error)throw e;throw TypeError('Uncaught, unspecified "error" event.')}if(r=this._events[t],s(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:for(i=arguments.length,a=new Array(i-1),u=1;i>u;u++)a[u-1]=arguments[u];r.apply(this,a)}else if(o(r)){for(i=arguments.length,a=new Array(i-1),u=1;i>u;u++)a[u-1]=arguments[u];for(c=r.slice(),i=c.length,u=0;i>u;u++)c[u].apply(this,a)}return!0},r.prototype.addListener=function(t,e){var i;if(!n(e))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",t,n(e.listener)?e.listener:e),this._events[t]?o(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,o(this._events[t])&&!this._events[t].warned){var i;i=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[t].length>i&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(t,e){function r(){this.removeListener(t,r),i||(i=!0,e.apply(this,arguments))}if(!n(e))throw TypeError("listener must be a function");var i=!1;return r.listener=e,this.on(t,r),this},r.prototype.removeListener=function(t,e){var r,i,s,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(r=this._events[t],s=r.length,i=-1,r===e||n(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(o(r)){for(a=s;a-->0;)if(r[a]===e||r[a].listener&&r[a].listener===e){i=a;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},r.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[t],n(r))this.removeListener(t,r);else for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},r.prototype.listeners=function(t){var e;return e=this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},r.listenerCount=function(t,e){var r;return r=t._events&&t._events[e]?n(t._events[e])?1:t._events[e].length:0}},{}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise); \ No newline at end of file
diff --git a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/async.js b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/async.js
index 39f23404b..3b5f828ce 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/async.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/async.js
@@ -59,6 +59,7 @@ Async.prototype.throwLater = function(fn, arg) {
Async.prototype._getDomain = function() {};
+if (!false) {
if (util.isNode) {
var EventsModule = require("events");
@@ -74,31 +75,32 @@ if (util.isNode) {
var descriptor =
Object.getOwnPropertyDescriptor(EventsModule, "usingDomains");
- if (!descriptor.configurable) {
- process.on("domainsActivated", function() {
- Async.prototype._getDomain = domainGetter;
- });
- } else {
- var usingDomains = false;
- Object.defineProperty(EventsModule, "usingDomains", {
- configurable: false,
- enumerable: true,
- get: function() {
- return usingDomains;
- },
- set: function(value) {
- if (usingDomains || !value) return;
- usingDomains = true;
+ if (descriptor) {
+ if (!descriptor.configurable) {
+ process.on("domainsActivated", function() {
Async.prototype._getDomain = domainGetter;
- util.toFastProperties(process);
- process.emit("domainsActivated");
- }
- });
+ });
+ } else {
+ var usingDomains = false;
+ Object.defineProperty(EventsModule, "usingDomains", {
+ configurable: false,
+ enumerable: true,
+ get: function() {
+ return usingDomains;
+ },
+ set: function(value) {
+ if (usingDomains || !value) return;
+ usingDomains = true;
+ Async.prototype._getDomain = domainGetter;
+ util.toFastProperties(process);
+ process.emit("domainsActivated");
+ }
+ });
+ }
}
-
-
}
}
+}
function AsyncInvokeLater(fn, receiver, arg) {
var domain = this._getDomain();
diff --git a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/direct_resolve.js b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/direct_resolve.js
index c61a367f5..47a9ce9dc 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/direct_resolve.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/direct_resolve.js
@@ -10,6 +10,10 @@ var returner = function () {
var thrower = function () {
throw this;
};
+var returnUndefined = function() {};
+var throwUndefined = function() {
+ throw undefined;
+};
var wrapper = function (value, action) {
if (action === 1) {
@@ -26,6 +30,8 @@ var wrapper = function (value, action) {
Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
+ if (value === undefined) return this.then(returnUndefined);
+
if (wrapsPrimitiveReceiver && isPrimitive(value)) {
return this._then(
wrapper(value, 2),
@@ -40,6 +46,8 @@ Promise.prototype.thenReturn = function (value) {
Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
+ if (reason === undefined) return this.then(throwUndefined);
+
if (wrapsPrimitiveReceiver && isPrimitive(reason)) {
return this._then(
wrapper(reason, 1),
diff --git a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/schedule.js b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/schedule.js
index 2355ffb77..37adaa15f 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/schedule.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/schedule.js
@@ -6,7 +6,7 @@ var noAsyncScheduler = function() {
if (require("./util.js").isNode) {
var version = process.versions.node.split(".").map(Number);
schedule = (version[0] === 0 && version[1] > 10) || (version[0] > 0)
- ? global.setImmediate : process.nextTick;
+ ? function(fn) { global.setImmediate(fn); } : process.nextTick;
if (!schedule) {
if (typeof setImmediate !== "undefined") {
diff --git a/node_modules/request/node_modules/har-validator/node_modules/bluebird/package.json b/node_modules/request/node_modules/har-validator/node_modules/bluebird/package.json
index 667cdfb14..58f2a6205 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/bluebird/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/bluebird/package.json
@@ -1,7 +1,7 @@
{
"name": "bluebird",
"description": "Full featured Promises/A+ implementation with exceptionally good performance",
- "version": "2.9.24",
+ "version": "2.9.26",
"keywords": [
"promise",
"performance",
@@ -71,10 +71,10 @@
"LICENSE",
"zalgo.js"
],
- "gitHead": "3f58d8ea478329a2400ab7fa0bd841289b02fc07",
- "_id": "bluebird@2.9.24",
- "_shasum": "14a2e75f0548323dc35aa440d92007ca154e967c",
- "_from": "bluebird@>=2.9.21 <3.0.0",
+ "gitHead": "c6604d44f219af9da683f6e28d818008fa374af2",
+ "_id": "bluebird@2.9.26",
+ "_shasum": "362772ea4d09f556a4b9f3b64c2fd136e87e3a55",
+ "_from": "bluebird@>=2.9.26 <3.0.0",
"_npmVersion": "2.7.1",
"_nodeVersion": "1.6.2",
"_npmUser": {
@@ -88,9 +88,9 @@
}
],
"dist": {
- "shasum": "14a2e75f0548323dc35aa440d92007ca154e967c",
- "tarball": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.24.tgz"
+ "shasum": "362772ea4d09f556a4b9f3b64c2fd136e87e3a55",
+ "tarball": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.26.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.24.tgz"
+ "_resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.26.tgz"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json
index 3dc27f258..3ae71e3ab 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json
@@ -5,7 +5,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "https://github.com/sindresorhus/ansi-styles"
+ "url": "git+https://github.com/sindresorhus/ansi-styles.git"
},
"author": {
"name": "Sindre Sorhus",
@@ -14,12 +14,14 @@
},
"maintainers": [
{
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "http://sindresorhus.com"
},
{
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
+ "name": "Joshua Appelman",
+ "email": "jappelman@xebia.com",
+ "url": "http://jbnicolai.com"
}
],
"engines": {
@@ -56,24 +58,14 @@
"devDependencies": {
"mocha": "*"
},
- "gitHead": "da6541334e1681cb803f891fab8abf4313cc4bc1",
+ "readme": "# ansi-styles [![Build Status](https://travis-ci.org/sindresorhus/ansi-styles.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-styles)\n\n> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal\n\nYou probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings.\n\n![](screenshot.png)\n\n\n## Install\n\n```sh\n$ npm install --save ansi-styles\n```\n\n\n## Usage\n\n```js\nvar ansi = require('ansi-styles');\n\nconsole.log(ansi.green.open + 'Hello world!' + ansi.green.close);\n```\n\n\n## API\n\nEach style has an `open` and `close` property.\n\n\n## Styles\n\n### Modifiers\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(not widely supported)*\n- `underline`\n- `inverse`\n- `hidden`\n- `strikethrough` *(not widely supported)*\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `gray`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n\n\n## Advanced usage\n\nBy 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.\n\n- `ansi.modifiers`\n- `ansi.colors`\n- `ansi.bgColors`\n\n\n###### Example\n\n```js\nconsole.log(ansi.colors.green.open);\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
+ "readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/ansi-styles/issues"
},
- "homepage": "https://github.com/sindresorhus/ansi-styles",
+ "homepage": "https://github.com/sindresorhus/ansi-styles#readme",
"_id": "ansi-styles@2.0.1",
"_shasum": "b033f57f93e2d28adeb8bc11138fa13da0fd20a3",
- "_from": "ansi-styles@>=2.0.1 <3.0.0",
- "_npmVersion": "2.1.16",
- "_nodeVersion": "0.10.35",
- "_npmUser": {
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
- },
- "dist": {
- "shasum": "b033f57f93e2d28adeb8bc11138fa13da0fd20a3",
- "tarball": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.1.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.1.tgz"
+ "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.1.tgz",
+ "_from": "ansi-styles@>=2.0.1 <3.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json
index 1564c1d00..b2bafb26a 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json
@@ -5,7 +5,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "https://github.com/sindresorhus/escape-string-regexp"
+ "url": "git+https://github.com/sindresorhus/escape-string-regexp.git"
},
"author": {
"name": "Sindre Sorhus",
@@ -14,12 +14,14 @@
},
"maintainers": [
{
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "http://sindresorhus.com"
},
{
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
+ "name": "Joshua Appelman",
+ "email": "jappelman@xebia.com",
+ "url": "http://jbnicolai.com"
}
],
"engines": {
@@ -46,24 +48,14 @@
"devDependencies": {
"mocha": "*"
},
- "gitHead": "1e446e6b4449b5f1f8868cd31bf8fd25ee37fb4b",
+ "readme": "# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)\n\n> Escape RegExp special characters\n\n\n## Install\n\n```sh\n$ npm install --save escape-string-regexp\n```\n\n\n## Usage\n\n```js\nvar escapeStringRegexp = require('escape-string-regexp');\n\nvar escapedString = escapeStringRegexp('how much $ for a unicorn?');\n//=> how much \\$ for a unicorn\\?\n\nnew RegExp(escapedString);\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
+ "readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/escape-string-regexp/issues"
},
- "homepage": "https://github.com/sindresorhus/escape-string-regexp",
+ "homepage": "https://github.com/sindresorhus/escape-string-regexp#readme",
"_id": "escape-string-regexp@1.0.3",
"_shasum": "9e2d8b25bc2555c3336723750e03f099c2735bb5",
- "_from": "escape-string-regexp@>=1.0.2 <2.0.0",
- "_npmVersion": "2.1.16",
- "_nodeVersion": "0.10.35",
- "_npmUser": {
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
- },
- "dist": {
- "shasum": "9e2d8b25bc2555c3336723750e03f099c2735bb5",
- "tarball": "http://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz"
+ "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz",
+ "_from": "escape-string-regexp@>=1.0.2 <2.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/get-stdin/package.json b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/get-stdin/package.json
index 5ee9b6775..0075a2213 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/get-stdin/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/get-stdin/package.json
@@ -5,7 +5,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "https://github.com/sindresorhus/get-stdin"
+ "url": "git+https://github.com/sindresorhus/get-stdin.git"
},
"author": {
"name": "Sindre Sorhus",
@@ -35,29 +35,14 @@
"ava": "0.0.4",
"buffer-equal": "0.0.1"
},
- "gitHead": "65c744975229b25d6cc5c7546f49b6ad9099553f",
+ "readme": "# get-stdin [![Build Status](https://travis-ci.org/sindresorhus/get-stdin.svg?branch=master)](https://travis-ci.org/sindresorhus/get-stdin)\n\n> Easier stdin\n\n\n## Install\n\n```sh\n$ npm install --save get-stdin\n```\n\n\n## Usage\n\n```js\n// example.js\nvar stdin = require('get-stdin');\n\nstdin(function (data) {\n\tconsole.log(data);\n\t//=> unicorns\n});\n```\n\n```sh\n$ echo unicorns | node example.js\nunicorns\n```\n\n\n## API\n\n### stdin(callback)\n\nGet `stdin` as a string.\n\n### stdin.buffer(callback)\n\nGet `stdin` as a buffer.\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
+ "readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/get-stdin/issues"
},
- "homepage": "https://github.com/sindresorhus/get-stdin",
+ "homepage": "https://github.com/sindresorhus/get-stdin#readme",
"_id": "get-stdin@4.0.1",
"_shasum": "b968c6b0a04384324902e8bf1a5df32579a450fe",
- "_from": "get-stdin@>=4.0.1 <5.0.0",
- "_npmVersion": "1.4.28",
- "_npmUser": {
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
- },
- "maintainers": [
- {
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
- }
- ],
- "dist": {
- "shasum": "b968c6b0a04384324902e8bf1a5df32579a450fe",
- "tarball": "http://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz"
+ "_resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "_from": "get-stdin@>=4.0.1 <5.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json
index ab7f986d5..11bcab998 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json
@@ -5,7 +5,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "https://github.com/sindresorhus/has-ansi"
+ "url": "git+https://github.com/sindresorhus/has-ansi.git"
},
"author": {
"name": "Sindre Sorhus",
@@ -14,12 +14,14 @@
},
"maintainers": [
{
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "http://sindresorhus.com"
},
{
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
+ "name": "Joshua Appelman",
+ "email": "jappelman@xebia.com",
+ "url": "http://jbnicolai.com"
}
],
"bin": {
@@ -68,24 +70,14 @@
"devDependencies": {
"mocha": "*"
},
- "gitHead": "416428ed16f8e9718aec54cea083173af6019917",
+ "readme": "# has-ansi [![Build Status](https://travis-ci.org/sindresorhus/has-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/has-ansi)\n\n> Check if a string has [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```sh\n$ npm install --save has-ansi\n```\n\n\n## Usage\n\n```js\nvar hasAnsi = require('has-ansi');\n\nhasAnsi('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nhasAnsi('cake');\n//=> false\n```\n\n\n## CLI\n\n```sh\n$ npm install --global has-ansi\n```\n\n```\n$ has-ansi --help\n\n Usage\n has-ansi <string>\n echo <string> | has-ansi\n\n Exits with code 0 if input has ANSI escape codes and 1 if not\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
+ "readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/has-ansi/issues"
},
- "homepage": "https://github.com/sindresorhus/has-ansi",
+ "homepage": "https://github.com/sindresorhus/has-ansi#readme",
"_id": "has-ansi@1.0.3",
"_shasum": "c0b5b1615d9e382b0ff67169d967b425e48ca538",
- "_from": "has-ansi@>=1.0.3 <2.0.0",
- "_npmVersion": "2.1.16",
- "_nodeVersion": "0.10.35",
- "_npmUser": {
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
- },
- "dist": {
- "shasum": "c0b5b1615d9e382b0ff67169d967b425e48ca538",
- "tarball": "http://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz"
+ "_resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz",
+ "_from": "has-ansi@>=1.0.3 <2.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json
index 7e3b7e63c..ca9b2c42e 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json
@@ -5,7 +5,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "https://github.com/sindresorhus/supports-color"
+ "url": "git+https://github.com/sindresorhus/supports-color.git"
},
"author": {
"name": "Sindre Sorhus",
@@ -14,12 +14,14 @@
},
"maintainers": [
{
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
},
{
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
+ "name": "Joshua Appelman",
+ "email": "jappelman@xebia.com",
+ "url": "jbnicolai.com"
}
],
"bin": {
@@ -61,24 +63,14 @@
"mocha": "*",
"require-uncached": "^1.0.2"
},
- "gitHead": "09f1b4c336cee7269b4c8b3a8880054a23fcb35e",
+ "readme": "# supports-color [![Build Status](https://travis-ci.org/sindresorhus/supports-color.svg?branch=master)](https://travis-ci.org/sindresorhus/supports-color)\n\n> Detect whether a terminal supports color\n\n\n## Install\n\n```\n$ npm install --save supports-color\n```\n\n\n## Usage\n\n```js\nvar supportsColor = require('supports-color');\n\nif (supportsColor) {\n\tconsole.log('Terminal supports color');\n}\n```\n\nIt obeys the `--color` and `--no-color` CLI flags.\n\nFor situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`.\n\n\n## CLI\n\n```\n$ npm install --global supports-color\n```\n\n```\n$ supports-color --help\n\n Usage\n supports-color\n\n Exits with code 0 if color is supported and 1 if not\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
+ "readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/supports-color/issues"
},
- "homepage": "https://github.com/sindresorhus/supports-color",
+ "homepage": "https://github.com/sindresorhus/supports-color#readme",
"_id": "supports-color@1.3.1",
"_shasum": "15758df09d8ff3b4acc307539fabe27095e1042d",
- "_from": "supports-color@>=1.3.0 <2.0.0",
- "_npmVersion": "2.5.1",
- "_nodeVersion": "0.12.0",
- "_npmUser": {
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
- },
- "dist": {
- "shasum": "15758df09d8ff3b4acc307539fabe27095e1042d",
- "tarball": "http://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz"
+ "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz",
+ "_from": "supports-color@>=1.3.0 <2.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json b/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json
index 7f2ca55b6..ce07ec6e4 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json
@@ -5,16 +5,18 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "https://github.com/sindresorhus/chalk"
+ "url": "git+https://github.com/sindresorhus/chalk.git"
},
"maintainers": [
{
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "http://sindresorhus.com"
},
{
- "name": "jbnicolai",
- "email": "jappelman@xebia.com"
+ "name": "Joshua Appelman",
+ "email": "jappelman@xebia.com",
+ "url": "http://jbnicolai.com"
}
],
"engines": {
@@ -59,24 +61,14 @@
"matcha": "^0.6.0",
"mocha": "*"
},
- "gitHead": "8864d3563313ed15574a38dd5c9d5966080c46ce",
+ "readme": "<h1 align=\"center\">\n\t<br>\n\t<img width=\"360\" src=\"https://cdn.rawgit.com/sindresorhus/chalk/19935d6484811c5e468817f846b7b3d417d7bf4a/logo.svg\" alt=\"chalk\">\n\t<br>\n\t<br>\n</h1>\n\n> Terminal string styling done right\n\n[![Build Status](https://travis-ci.org/sindresorhus/chalk.svg?branch=master)](https://travis-ci.org/sindresorhus/chalk) [![](http://img.shields.io/badge/unicorn-approved-ff69b4.svg?style=flat)](https://www.youtube.com/watch?v=Sm368W0OsHo)\n\n[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.\n\n**Chalk is a clean and focused alternative.**\n\n![screenshot](https://github.com/sindresorhus/ansi-styles/raw/master/screenshot.png)\n\n\n## Why\n\n- Highly performant\n- Doesn't extend `String.prototype`\n- Expressive API\n- Ability to nest styles\n- Clean and focused\n- Auto-detects color support\n- Actively maintained\n- [Used by ~3000 modules](https://www.npmjs.com/browse/depended/chalk)\n\n\n## Install\n\n```\n$ npm install --save chalk\n```\n\n\n## Usage\n\nChalk comes with an easy to use composable API where you just chain and nest the styles you want.\n\n```js\nvar chalk = require('chalk');\n\n// style a string\nchalk.blue('Hello world!');\n\n// combine styled and normal strings\nchalk.blue('Hello') + 'World' + chalk.red('!');\n\n// compose multiple styles using the chainable API\nchalk.blue.bgRed.bold('Hello world!');\n\n// pass in multiple arguments\nchalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz');\n\n// nest styles\nchalk.red('Hello', chalk.underline.bgBlue('world') + '!');\n\n// nest styles of the same type even (color, underline, background)\nchalk.green(\n\t'I am a green line ' +\n\tchalk.blue.underline.bold('with a blue substring') +\n\t' that becomes green again!'\n);\n```\n\nEasily define your own themes.\n\n```js\nvar chalk = require('chalk');\nvar error = chalk.bold.red;\nconsole.log(error('Error!'));\n```\n\nTake advantage of console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data).\n\n```js\nvar name = 'Sindre';\nconsole.log(chalk.green('Hello %s'), name);\n//=> Hello Sindre\n```\n\n\n## API\n\n### chalk.`<style>[.<style>...](string, [string...])`\n\nExample: `chalk.red.bold.underline('Hello', 'world');`\n\nChain [styles](#styles) and 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`.\n\nMultiple arguments will be separated by space.\n\n### chalk.enabled\n\nColor support is automatically detected, but you can override it by setting the `enabled` property. You should however only do this in your own code as it applies globally to all chalk consumers.\n\nIf you need to change this in a reusable module create a new instance:\n\n```js\nvar ctx = new chalk.constructor({enabled: false});\n```\n\n### chalk.supportsColor\n\nDetect whether the terminal [supports color](https://github.com/sindresorhus/supports-color). Used internally and handled for you, but exposed for convenience.\n\nCan be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`.\n\n### chalk.styles\n\nExposes the styles as [ANSI escape codes](https://github.com/sindresorhus/ansi-styles).\n\nGenerally not useful, but you might need just the `.open` or `.close` escape code if you're mixing externally styled strings with your own.\n\n```js\nvar chalk = require('chalk');\n\nconsole.log(chalk.styles.red);\n//=> {open: '\\u001b[31m', close: '\\u001b[39m'}\n\nconsole.log(chalk.styles.red.open + 'Hello' + chalk.styles.red.close);\n```\n\n### chalk.hasColor(string)\n\nCheck whether a string [has color](https://github.com/sindresorhus/has-ansi).\n\n### chalk.stripColor(string)\n\n[Strip color](https://github.com/sindresorhus/strip-ansi) from a string.\n\nCan be useful in combination with `.supportsColor` to strip color on externally styled text when it's not supported.\n\nExample:\n\n```js\nvar chalk = require('chalk');\nvar styledString = getText();\n\nif (!chalk.supportsColor) {\n\tstyledString = chalk.stripColor(styledString);\n}\n```\n\n\n## Styles\n\n### Modifiers\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(not widely supported)*\n- `underline`\n- `inverse`\n- `hidden`\n- `strikethrough` *(not widely supported)*\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue` *(on Windows the bright version is used as normal blue is illegible)*\n- `magenta`\n- `cyan`\n- `white`\n- `gray`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n\n\n## 256-colors\n\nChalk does not support support anything other than the base eight colors, which guarantees it will work on all terminals and systems. Some terminals, specifically `xterm` compliant ones, will support the full range of 8-bit colors. For this the lower level [ansi-256-colors](https://github.com/jbnicolai/ansi-256-colors) package can be used.\n\n\n## Windows\n\nIf you're on Windows, do yourself a favor and use [`cmder`](http://bliker.github.io/cmder/) instead of `cmd.exe`.\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
+ "readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/chalk/issues"
},
- "homepage": "https://github.com/sindresorhus/chalk",
+ "homepage": "https://github.com/sindresorhus/chalk#readme",
"_id": "chalk@1.0.0",
"_shasum": "b3cf4ed0ff5397c99c75b8f679db2f52831f96dc",
- "_from": "chalk@>=1.0.0 <2.0.0",
- "_npmVersion": "2.5.1",
- "_nodeVersion": "0.12.0",
- "_npmUser": {
- "name": "sindresorhus",
- "email": "sindresorhus@gmail.com"
- },
- "dist": {
- "shasum": "b3cf4ed0ff5397c99c75b8f679db2f52831f96dc",
- "tarball": "http://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz"
+ "_resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz",
+ "_from": "chalk@>=1.0.0 <2.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/commander/History.md b/node_modules/request/node_modules/har-validator/node_modules/commander/History.md
index 3a69559ed..7b8b2c494 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/commander/History.md
+++ b/node_modules/request/node_modules/har-validator/node_modules/commander/History.md
@@ -1,4 +1,21 @@
+2.8.1 / 2015-04-22
+==================
+
+ * Back out `support multiline description` Close #396 #397
+
+
+
+2.8.0 / 2015-04-07
+==================
+
+ * Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee
+ * Fix bug in Git-style sub-commands #372 @zhiyelee
+ * Allow commands to be hidden from help #383 @tonylukasavage
+ * When git-style sub-commands are in use, yet none are called, display help #382 @claylo
+ * Add ability to specify arguments syntax for top-level command #258 @rrthomas
+ * Support multiline descriptions #208 @zxqfox
+
2.7.1 / 2015-03-11
==================
diff --git a/node_modules/request/node_modules/har-validator/node_modules/commander/Readme.md b/node_modules/request/node_modules/har-validator/node_modules/commander/Readme.md
index 4e091d2ab..af58e22c9 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/commander/Readme.md
+++ b/node_modules/request/node_modules/har-validator/node_modules/commander/Readme.md
@@ -31,14 +31,14 @@ program
.version('0.0.1')
.option('-p, --peppers', 'Add peppers')
.option('-P, --pineapple', 'Add pineapple')
- .option('-b, --bbq', 'Add bbq sauce')
+ .option('-b, --bbq-sauce', 'Add bbq sauce')
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
.parse(process.argv);
console.log('you ordered a pizza with:');
if (program.peppers) console.log(' - peppers');
if (program.pineapple) console.log(' - pineapple');
-if (program.bbq) console.log(' - bbq');
+if (program.bbqSauce) console.log(' - bbq');
console.log(' - %s cheese', program.cheese);
```
@@ -132,6 +132,31 @@ program.parse(process.argv);
An `Array` is used for the value of a variadic argument. This applies to `program.args` as well as the argument passed
to your action as demonstrated above.
+## Specify the argument syntax
+
+```js
+#!/usr/bin/env node
+
+var program = require('../');
+
+program
+ .version('0.0.1')
+ .arguments('<cmd> [env]')
+ .action(function (cmd, env) {
+ cmdValue = cmd;
+ envValue = env;
+ });
+
+program.parse(process.argv);
+
+if (typeof cmdValue === 'undefined') {
+ console.error('no command given!');
+ process.exit(1);
+}
+console.log('command:', cmdValue);
+console.log('environment:', envValue || "no environment given");
+```
+
## Git-style sub-commands
```js
@@ -149,7 +174,13 @@ program
When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.
The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.
-If the program is designed to installed globally, make sure the executables have proper modes, like `755`.
+If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
+
+### `--harmony`
+
+You can enable `--harmony` option in two ways:
+* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.
+* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.
## Automated --help
diff --git a/node_modules/request/node_modules/har-validator/node_modules/commander/index.js b/node_modules/request/node_modules/har-validator/node_modules/commander/index.js
index 1abf4df9d..877696565 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/commander/index.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/commander/index.js
@@ -156,7 +156,8 @@ Command.prototype.__proto__ = EventEmitter.prototype;
* @api public
*/
-Command.prototype.command = function(name, desc) {
+Command.prototype.command = function(name, desc, opts) {
+ opts = opts || {};
var args = name.split(/ +/);
var cmd = new Command(args.shift());
@@ -166,6 +167,7 @@ Command.prototype.command = function(name, desc) {
this._execs[cmd._name] = true;
}
+ cmd._noHelp = !!opts.noHelp;
this.commands.push(cmd);
cmd.parseExpectedArgs(args);
cmd.parent = this;
@@ -175,6 +177,16 @@ Command.prototype.command = function(name, desc) {
};
/**
+ * Define argument syntax for the top-level command.
+ *
+ * @api public
+ */
+
+Command.prototype.arguments = function (desc) {
+ return this.parseExpectedArgs(desc.split(/ +/));
+}
+
+/**
* Add an implicit `help [cmd]` subcommand
* which invokes `--help` for the given command.
*
@@ -288,8 +300,10 @@ Command.prototype.action = function(fn) {
fn.apply(self, args);
};
- this.parent.on(this._name, listener);
- if (this._alias) this.parent.on(this._alias, listener);
+ var parent = this.parent || this;
+ var name = parent === this ? '*' : this._name;
+ parent.on(name, listener);
+ if (this._alias) parent.on(this._alias, listener);
return this;
};
@@ -431,6 +445,12 @@ Command.prototype.parse = function(argv) {
// guess name
this._name = this._name || basename(argv[1], '.js');
+ // github-style sub-commands with no sub-command
+ if (this.executables && argv.length < 3) {
+ // this user needs help
+ argv.push('--help');
+ }
+
// process argv
var parsed = this.parseOptions(this.normalize(argv.slice(2)));
var args = this.args = parsed.args;
@@ -469,30 +489,48 @@ Command.prototype.executeSubCommand = function(argv, args, unknown) {
// executable
var f = argv[1];
- var link = readlink(f);
+ // name of the subcommand, link `pm-install`
+ var bin = basename(f, '.js') + '-' + args[0];
+
+
+ // In case of globally installed, get the base dir where executable
+ // subcommand file should be located at
+ var baseDir
+ , link = readlink(f);
+
+ // when symbolink is relative path
if (link !== f && link.charAt(0) !== '/') {
link = path.join(dirname(f), link)
}
- var dir = dirname(link);
- var bin = basename(f, '.js') + '-' + args[0];
+ baseDir = dirname(link);
// prefer local `./<bin>` to bin in the $PATH
- var local = path.join(dir, bin);
- try {
- // for versions before node v0.8 when there weren't `fs.existsSync`
- if (fs.statSync(local).isFile()) {
- bin = local;
- }
- } catch (e) {}
+ var localBin = path.join(baseDir, bin);
+
+ // whether bin file is a js script with explicit `.js` extension
+ var isExplicitJS = false;
+ if (exists(localBin + '.js')) {
+ bin = localBin + '.js';
+ isExplicitJS = true;
+ } else if (exists(localBin)) {
+ bin = localBin;
+ }
- // run it
args = args.slice(1);
var proc;
if (process.platform !== 'win32') {
- proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
+ if (isExplicitJS) {
+ args.unshift(localBin);
+ // add executable arguments to spawn
+ args = (process.execArgv || []).concat(args);
+
+ proc = spawn('node', args, { stdio: 'inherit', customFds: [0, 1, 2] });
+ } else {
+ proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
+ }
} else {
- args.unshift(local);
+ args.unshift(localBin);
proc = spawn(process.execPath, args, { stdio: 'inherit'});
}
@@ -888,7 +926,9 @@ Command.prototype.optionHelp = function() {
Command.prototype.commandHelp = function() {
if (!this.commands.length) return '';
- var commands = this.commands.map(function(cmd) {
+ var commands = this.commands.filter(function(cmd) {
+ return !cmd._noHelp;
+ }).map(function(cmd) {
var args = cmd._args.map(function(arg) {
return humanReadableArgName(arg);
}).join(' ');
@@ -1049,3 +1089,15 @@ function humanReadableArgName(arg) {
? '<' + nameOutput + '>'
: '[' + nameOutput + ']'
}
+
+// for versions before node v0.8 when there weren't `fs.existsSync`
+function exists(file) {
+ try {
+ if (fs.statSync(file).isFile()) {
+ return true;
+ }
+ } catch (e) {
+ return false;
+ }
+}
+
diff --git a/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/package.json b/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/package.json
index 6f38f45aa..64d7d644d 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/package.json
@@ -22,26 +22,10 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
- "gitHead": "f6655275bebef706fb63fd01b5f062a7052419a5",
+ "readme": "# graceful-readlink\n[![NPM Version](http://img.shields.io/npm/v/graceful-readlink.svg?style=flat)](https://www.npmjs.org/package/graceful-readlink)\n[![NPM Downloads](https://img.shields.io/npm/dm/graceful-readlink.svg?style=flat)](https://www.npmjs.org/package/graceful-readlink)\n\n\n## Usage\n\n```js\nvar readlinkSync = require('graceful-readlink').readlinkSync;\nconsole.log(readlinkSync(f));\n// output\n// the file pointed to when `f` is a symbolic link\n// the `f` itself when `f` is not a symbolic link\n```\n## Licence\n\nMIT License\n",
+ "readmeFilename": "README.md",
"_id": "graceful-readlink@1.0.1",
"_shasum": "4cafad76bc62f02fa039b2f94e9a3dd3a391a725",
- "_from": "graceful-readlink@>=1.0.0",
- "_npmVersion": "2.1.17",
- "_nodeVersion": "0.11.14",
- "_npmUser": {
- "name": "zhiyelee",
- "email": "zhiyelee@gmail.com"
- },
- "maintainers": [
- {
- "name": "zhiyelee",
- "email": "zhiyelee@gmail.com"
- }
- ],
- "dist": {
- "shasum": "4cafad76bc62f02fa039b2f94e9a3dd3a391a725",
- "tarball": "http://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
+ "_resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "_from": "graceful-readlink@>=1.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/commander/package.json b/node_modules/request/node_modules/har-validator/node_modules/commander/package.json
index 25ba0464a..6b4595126 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/commander/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/commander/package.json
@@ -1,6 +1,6 @@
{
"name": "commander",
- "version": "2.7.1",
+ "version": "2.8.1",
"description": "the complete solution for node.js command-line programs",
"keywords": [
"command",
@@ -14,10 +14,11 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "https://github.com/tj/commander.js.git"
+ "url": "git+https://github.com/tj/commander.js.git"
},
"devDependencies": {
- "should": ">= 0.0.1"
+ "should": ">= 0.0.1",
+ "sinon": ">= 1.14.1"
},
"scripts": {
"test": "make test"
@@ -32,16 +33,16 @@
"dependencies": {
"graceful-readlink": ">= 1.0.0"
},
- "gitHead": "103654f8f32c010ad1e62cefc9ab92d7c8d18c8e",
+ "gitHead": "c6c84726050b19c0373de27cd359f3baddff579f",
"bugs": {
"url": "https://github.com/tj/commander.js/issues"
},
"homepage": "https://github.com/tj/commander.js",
- "_id": "commander@2.7.1",
- "_shasum": "5d419a2bbed2c32ee3e4dca9bb45ab83ecc3065a",
- "_from": "commander@>=2.7.1 <3.0.0",
- "_npmVersion": "2.1.17",
- "_nodeVersion": "0.11.14",
+ "_id": "commander@2.8.1",
+ "_shasum": "06be367febfda0c330aa1e2a072d3dc9762425d4",
+ "_from": "commander@>=2.8.1 <3.0.0",
+ "_npmVersion": "2.5.1",
+ "_nodeVersion": "0.12.0",
"_npmUser": {
"name": "zhiyelee",
"email": "zhiyelee@gmail.com"
@@ -65,9 +66,10 @@
}
],
"dist": {
- "shasum": "5d419a2bbed2c32ee3e4dca9bb45ab83ecc3065a",
- "tarball": "http://registry.npmjs.org/commander/-/commander-2.7.1.tgz"
+ "shasum": "06be367febfda0c330aa1e2a072d3dc9762425d4",
+ "tarball": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/commander/-/commander-2.7.1.tgz"
+ "_resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
index 445f7db2d..6fef4ed6f 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
@@ -24,14 +24,32 @@ var get = function(obj, additionalSchemas, ptr) {
try {
return jsonpointer.get(obj, decodeURI(ptr))
} catch (err) {
- var other = additionalSchemas[ptr] || additionalSchemas[ptr.replace(/^#/, '')]
+ var end = ptr.indexOf('#')
+ var other
+ // external reference
+ if (end !== 0) {
+ // fragment doesn't exist.
+ if (end === -1) {
+ other = additionalSchemas[ptr]
+ } else {
+ var ext = ptr.slice(0, end)
+ other = additionalSchemas[ext]
+ var fragment = ptr.slice(end).replace(/^#/, '')
+ try {
+ return jsonpointer.get(other, fragment)
+ } catch (err) {}
+ }
+ } else {
+ other = additionalSchemas[ptr]
+ }
return other || null
}
}
var formatName = function(field) {
- var pattern = /\[[^\[\]"]+\]/
- while (pattern.test(field)) field = field.replace(pattern, '.*')
+ field = JSON.stringify(field)
+ var pattern = /\[([^\[\]"]+)\]/
+ while (pattern.test(field)) field = field.replace(pattern, '."+$1+"')
return field
}
@@ -132,11 +150,9 @@ var compile = function(schema, cache, root, reporter, opts) {
if (reporter === true) {
validate('if (validate.errors === null) validate.errors = []')
if (verbose) {
- validate('validate.errors.push({field:%s,message:%s,value:%s})', JSON.stringify(formatName(prop || name)), JSON.stringify(msg), value || name)
+ validate('validate.errors.push({field:%s,message:%s,value:%s})', formatName(prop || name), JSON.stringify(msg), value || name)
} else {
- var n = gensym('error')
- scope[n] = {field:formatName(prop || name), message:msg}
- validate('validate.errors.push(%s)', n)
+ validate('validate.errors.push({field:%s,message:%s})', formatName(prop || name), JSON.stringify(msg))
}
}
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json
index c09cb992b..e2bc77284 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json
@@ -8,7 +8,7 @@
},
"repository": {
"type": "git",
- "url": "https://github.com/mafintosh/generate-function"
+ "url": "git+https://github.com/mafintosh/generate-function.git"
},
"keywords": [
"generate",
@@ -28,25 +28,10 @@
"devDependencies": {
"tape": "^2.13.4"
},
- "gitHead": "3d5fc8de5859be95f58e3af9bfb5f663edd95149",
+ "readme": "# generate-function\n\nModule that helps you write generated functions in Node\n\n```\nnpm install generate-function\n```\n\n[![build status](http://img.shields.io/travis/mafintosh/generate-function.svg?style=flat)](http://travis-ci.org/mafintosh/generate-function)\n\n## Disclamer\n\nWriting code that generates code is hard.\nYou should only use this if you really, really, really need this for performance reasons (like schema validators / parsers etc).\n\n## Usage\n\n``` js\nvar genfun = require('generate-function')\n\nvar addNumber = function(val) {\n var fn = genfun()\n ('function add(n) {')\n ('return n + %d', val) // supports format strings to insert values\n ('}')\n\n return fn.toFunction() // will compile the function\n}\n\nvar add2 = addNumber(2)\n\nconsole.log('1+2=', add2(1))\nconsole.log(add2.toString()) // prints the generated function\n```\n\nIf you need to close over variables in your generated function pass them to `toFunction(scope)`\n\n``` js\nvar multiply = function(a, b) {\n return a * b\n}\n\nvar addAndMultiplyNumber = function(val) {\n var fn = genfun()\n ('function(n) {')\n ('if (typeof n !== \"number\") {') // ending a line with { will indent the source\n ('throw new Error(\"argument should be a number\")')\n ('}')\n ('var result = multiply(%d, n+%d)', val, val)\n ('return result')\n ('}')\n\n // use fn.toString() if you want to see the generated source\n\n return fn.toFunction({\n multiply: multiply\n })\n}\n\nvar addAndMultiply2 = addAndMultiplyNumber(2)\n\nconsole.log('(3 + 2) * 2 =', addAndMultiply2(3))\n```\n\n## Related\n\nSee [generate-object-property](https://github.com/mafintosh/generate-object-property) if you need to safely generate code that\ncan be used to reference an object property\n\n## License\n\nMIT",
+ "readmeFilename": "README.md",
"_id": "generate-function@2.0.0",
"_shasum": "6858fe7c0969b7d4e9093337647ac79f60dfbe74",
- "_from": "generate-function@>=2.0.0 <3.0.0",
- "_npmVersion": "1.4.23",
- "_npmUser": {
- "name": "mafintosh",
- "email": "mathiasbuus@gmail.com"
- },
- "maintainers": [
- {
- "name": "mafintosh",
- "email": "mathiasbuus@gmail.com"
- }
- ],
- "dist": {
- "shasum": "6858fe7c0969b7d4e9093337647ac79f60dfbe74",
- "tarball": "http://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz"
+ "_resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "_from": "generate-function@>=2.0.0 <3.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
index 8337c183d..5dc9f776d 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
@@ -5,4 +5,8 @@ var gen = function(obj, prop) {
}
gen.valid = isProperty
-module.exports = gen \ No newline at end of file
+gen.property = function (prop) {
+ return isProperty(prop) ? prop : JSON.stringify(prop)
+}
+
+module.exports = gen
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json
index fda11c85e..41225e266 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json
@@ -30,29 +30,15 @@
"name": "Mikola Lysenko"
},
"license": "MIT",
+ "readmeFilename": "README.md",
"gitHead": "0a85ea5b6b1264ea1cdecc6e5cf186adbb3ffc50",
"bugs": {
"url": "https://github.com/mikolalysenko/is-property/issues"
},
- "homepage": "https://github.com/mikolalysenko/is-property",
+ "readme": "is-property\n===========\nTests if a property of a JavaScript object can be accessed using the dot (.) notation or if it must be enclosed in brackets, (ie use x[\" ... \"])\n\nExample\n-------\n\n```javascript\nvar isProperty = require(\"is-property\")\n\nconsole.log(isProperty(\"foo\")) //Prints true\nconsole.log(isProperty(\"0\")) //Prints false\n```\n\nInstall\n-------\n\n npm install is-property\n \n### `require(\"is-property\")(str)`\nChecks if str is a property\n\n* `str` is a string which we will test if it is a property or not\n\n**Returns** true or false depending if str is a property\n\n## Credits\n(c) 2013 Mikola Lysenko. MIT License",
+ "homepage": "https://github.com/mikolalysenko/is-property#readme",
"_id": "is-property@1.0.2",
"_shasum": "57fe1c4e48474edd65b09911f26b1cd4095dda84",
- "_from": "is-property@>=1.0.0 <2.0.0",
- "_npmVersion": "2.1.4",
- "_nodeVersion": "0.10.26",
- "_npmUser": {
- "name": "mikolalysenko",
- "email": "mikolalysenko@gmail.com"
- },
- "maintainers": [
- {
- "name": "mikolalysenko",
- "email": "mikolalysenko@gmail.com"
- }
- ],
- "dist": {
- "shasum": "57fe1c4e48474edd65b09911f26b1cd4095dda84",
- "tarball": "http://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz"
- },
- "_resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz"
+ "_resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "_from": "is-property@>=1.0.0 <2.0.0"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json
index 2de77e019..8bc73da75 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json
@@ -1,10 +1,10 @@
{
"name": "generate-object-property",
- "version": "1.1.1",
+ "version": "1.2.0",
"description": "Generate safe JS code that can used to reference a object property",
"repository": {
"type": "git",
- "url": "https://github.com/mafintosh/generate-object-property"
+ "url": "git+https://github.com/mafintosh/generate-object-property.git"
},
"devDependencies": {
"tape": "^2.13.0"
@@ -25,12 +25,12 @@
"url": "@mafintosh"
},
"license": "MIT",
- "gitHead": "366cb415f6b73904b809e554f685ef1eefe308d8",
- "_id": "generate-object-property@1.1.1",
- "_shasum": "8fda6b4cb69b34a189a6cebee7c4c268af47cc93",
+ "gitHead": "0dd7d411018de54b2eae63b424c15b3e50bd678c",
+ "_id": "generate-object-property@1.2.0",
+ "_shasum": "9c0e1c40308ce804f4783618b937fa88f99d50d0",
"_from": "generate-object-property@>=1.1.0 <2.0.0",
- "_npmVersion": "2.7.1",
- "_nodeVersion": "1.6.2",
+ "_npmVersion": "2.9.0",
+ "_nodeVersion": "2.0.1",
"_npmUser": {
"name": "mafintosh",
"email": "mathiasbuus@gmail.com"
@@ -42,9 +42,10 @@
}
],
"dist": {
- "shasum": "8fda6b4cb69b34a189a6cebee7c4c268af47cc93",
- "tarball": "http://registry.npmjs.org/generate-object-property/-/generate-object-property-1.1.1.tgz"
+ "shasum": "9c0e1c40308ce804f4783618b937fa88f99d50d0",
+ "tarball": "http://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.1.1.tgz"
+ "_resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json
index 1c5623b46..64e45bd03 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json
@@ -23,7 +23,7 @@
],
"repository": {
"type": "git",
- "url": "http://github.com/janl/node-jsonpointer.git"
+ "url": "git+ssh://git@github.com/janl/node-jsonpointer.git"
},
"bugs": {
"url": "http://github.com/janl/node-jsonpointer/issues"
@@ -37,23 +37,8 @@
},
"readme": "# JSON Pointer for nodejs\n\nThis is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-08).\n\n## Usage\n\n var jsonpointer = require(\"jsonpointer\");\n var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]};\n var one = jsonpointer.get(obj, \"/foo\");\n var two = jsonpointer.get(obj, \"/bar/baz\");\n var three = jsonpointer.get(obj, \"/qux/0\");\n var four = jsonpointer.get(obj, \"/qux/1\");\n var five = jsonpointer.get(obj, \"/qux/2\");\n\n jsonpointer.set(obj, \"/foo\", 6); // obj.foo = 6;\n\n## Testing\n\n $ node test.js\n All tests pass.\n $\n\n[![Build Status](https://travis-ci.org/janl/node-jsonpointer.png?branch=master)](undefined)\n\n## Author\n\n(c) 2011 Jan Lehnardt <jan@apache.org>\n\n## License\n\nMIT License.",
"readmeFilename": "README.md",
+ "homepage": "https://github.com/janl/node-jsonpointer#readme",
"_id": "jsonpointer@1.1.0",
- "dist": {
- "shasum": "c3c72efaed3b97154163dc01dd349e1cfe0f80fc",
- "tarball": "http://registry.npmjs.org/jsonpointer/-/jsonpointer-1.1.0.tgz"
- },
- "_npmVersion": "1.1.69",
- "_npmUser": {
- "name": "jan",
- "email": "jan@apache.org"
- },
- "maintainers": [
- {
- "name": "jan",
- "email": "jan@apache.org"
- }
- ],
- "directories": {},
"_shasum": "c3c72efaed3b97154163dc01dd349e1cfe0f80fc",
"_resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-1.1.0.tgz",
"_from": "jsonpointer@>=1.1.0 <2.0.0"
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json
index 3095187c7..4f090f3c6 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json
@@ -1,6 +1,6 @@
{
"name": "is-my-json-valid",
- "version": "2.10.1",
+ "version": "2.12.0",
"description": "A JSONSchema validator that uses code generation to be extremely fast",
"main": "index.js",
"dependencies": {
@@ -17,7 +17,7 @@
},
"repository": {
"type": "git",
- "url": "https://github.com/mafintosh/is-my-json-valid"
+ "url": "git+https://github.com/mafintosh/is-my-json-valid.git"
},
"keywords": [
"json",
@@ -33,12 +33,12 @@
"url": "https://github.com/mafintosh/is-my-json-valid/issues"
},
"homepage": "https://github.com/mafintosh/is-my-json-valid",
- "gitHead": "c2341ceadb4662cc7cd2a6b59fbffdb1c24bbc05",
- "_id": "is-my-json-valid@2.10.1",
- "_shasum": "bf20ca7e71116302f8660ac812659f71e22ea2d0",
- "_from": "is-my-json-valid@>=2.10.0 <3.0.0",
- "_npmVersion": "2.7.5",
- "_nodeVersion": "1.6.4",
+ "gitHead": "fc2d995ecb1bdb0f367ddf114dfd069265043c6c",
+ "_id": "is-my-json-valid@2.12.0",
+ "_shasum": "8fa6c408b26be95b45a23e8f8c4b464a53874d2b",
+ "_from": "is-my-json-valid@>=2.12.0 <3.0.0",
+ "_npmVersion": "2.9.0",
+ "_nodeVersion": "2.0.1",
"_npmUser": {
"name": "mafintosh",
"email": "mathiasbuus@gmail.com"
@@ -51,12 +51,17 @@
{
"name": "watson",
"email": "w@tson.dk"
+ },
+ {
+ "name": "freeall",
+ "email": "freeall@gmail.com"
}
],
"dist": {
- "shasum": "bf20ca7e71116302f8660ac812659f71e22ea2d0",
- "tarball": "http://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.10.1.tgz"
+ "shasum": "8fa6c408b26be95b45a23e8f8c4b464a53874d2b",
+ "tarball": "http://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.10.1.tgz"
+ "_resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.0.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js
index 6f22d007f..b5109e576 100644
--- a/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js
+++ b/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js
@@ -278,6 +278,36 @@ tape('external schemas', function(t) {
t.end()
})
+tape('top-level external schema', function(t) {
+ var defs = {
+ "string": {
+ type: "string"
+ },
+ "sex": {
+ type: "string",
+ enum: ["male", "female", "other"]
+ }
+ }
+ var schema = {
+ type: "object",
+ properties: {
+ "name": { $ref: "definitions.json#/string" },
+ "sex": { $ref: "definitions.json#/sex" }
+ },
+ required: ["name", "sex"]
+ }
+
+ var validate = validator(schema, {
+ schemas: {
+ "definitions.json": defs
+ }
+ })
+ t.ok(validate({name:"alice", sex:"female"}), 'is an object')
+ t.notOk(validate({name:"alice", sex: "bob"}), 'recognizes external schema')
+ t.notOk(validate({name:2, sex: "female"}), 'recognizes external schema')
+ t.end()
+})
+
tape('nested required array decl', function(t) {
var schema = {
properties: {
@@ -364,3 +394,36 @@ tape('Date.now() is an integer', function(t) {
t.ok(validate(Date.now()), 'is integer')
t.end()
})
+
+tape('field shows item index in arrays', function(t) {
+ var schema = {
+ type: 'array',
+ items: {
+ type: 'array',
+ items: {
+ properties: {
+ foo: {
+ type: 'string',
+ required: true
+ }
+ }
+ }
+ }
+ }
+
+ var validate = validator(schema)
+
+ validate([
+ [
+ { foo: 'test' },
+ { foo: 'test' }
+ ],
+ [
+ { foo: 'test' },
+ { baz: 'test' }
+ ]
+ ])
+
+ t.strictEqual(validate.errors[0].field, 'data.1.1.foo', 'should output the field with specific index of failing item in the error')
+ t.end()
+})
diff --git a/node_modules/request/node_modules/har-validator/package.json b/node_modules/request/node_modules/har-validator/package.json
index 77cb60428..8255961df 100644
--- a/node_modules/request/node_modules/har-validator/package.json
+++ b/node_modules/request/node_modules/har-validator/package.json
@@ -1,5 +1,5 @@
{
- "version": "1.6.1",
+ "version": "1.7.1",
"name": "har-validator",
"description": "Extremely fast HTTP Archive (HAR) validator using JSON Schema",
"author": {
@@ -8,6 +8,10 @@
"url": "https://www.ahmadnassri.com/"
},
"homepage": "https://github.com/ahmadnassri/har-validator",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ahmadnassri/har-validator"
+ },
"license": "MIT",
"main": "./src/index.js",
"bin": {
@@ -27,38 +31,40 @@
"bin",
"src"
],
- "repository": {
- "type": "git",
- "url": "https://github.com/ahmadnassri/har-validator"
- },
"bugs": {
"url": "https://github.com/ahmadnassri/har-validator/issues"
},
"scripts": {
- "test": "standard && mocha --reporter spec",
+ "test": "standard && echint && mocha --reporter spec",
"coverage": "istanbul cover ./node_modules/mocha/bin/_mocha",
"codeclimate": "codeclimate < coverage/lcov.info"
},
+ "echint": {
+ "ignore": [
+ "coverage/**"
+ ]
+ },
"devDependencies": {
"codeclimate-test-reporter": "0.0.4",
- "istanbul": "^0.3.11",
- "mocha": "^2.2.1",
+ "echint": "^1.1.0",
+ "istanbul": "^0.3.14",
+ "mocha": "^2.2.5",
"require-directory": "^2.1.0",
- "should": "^5.2.0",
- "standard": "^3.3.0"
+ "should": "^6.0.3",
+ "standard": "^3.11.1"
},
"dependencies": {
- "bluebird": "^2.9.21",
+ "bluebird": "^2.9.26",
"chalk": "^1.0.0",
- "commander": "^2.7.1",
- "is-my-json-valid": "^2.10.0"
+ "commander": "^2.8.1",
+ "is-my-json-valid": "^2.12.0"
},
- "gitHead": "aa68c8efacea7437bb545d816a14e20db444fde5",
- "_id": "har-validator@1.6.1",
- "_shasum": "baef452cde645eff7d26562e8e749d7fd000b7fd",
- "_from": "har-validator@>=1.4.0 <2.0.0",
- "_npmVersion": "2.5.1",
- "_nodeVersion": "0.12.1",
+ "gitHead": "328d7f2f37affcc4fca1db13da68f2be817ad31c",
+ "_id": "har-validator@1.7.1",
+ "_shasum": "8ec8952f8287d21b451ba3e36f27ed8d997d8a95",
+ "_from": "har-validator@>=1.6.1 <2.0.0",
+ "_npmVersion": "2.7.4",
+ "_nodeVersion": "0.12.2",
"_npmUser": {
"name": "ahmadnassri",
"email": "ahmad@ahmadnassri.com"
@@ -70,9 +76,9 @@
}
],
"dist": {
- "shasum": "baef452cde645eff7d26562e8e749d7fd000b7fd",
- "tarball": "http://registry.npmjs.org/har-validator/-/har-validator-1.6.1.tgz"
+ "shasum": "8ec8952f8287d21b451ba3e36f27ed8d997d8a95",
+ "tarball": "http://registry.npmjs.org/har-validator/-/har-validator-1.7.1.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.6.1.tgz"
+ "_resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.7.1.tgz"
}
diff --git a/node_modules/request/node_modules/har-validator/src/index.js b/node_modules/request/node_modules/har-validator/src/index.js
index 6d521677d..d0324ccd1 100644
--- a/node_modules/request/node_modules/har-validator/src/index.js
+++ b/node_modules/request/node_modules/har-validator/src/index.js
@@ -20,7 +20,7 @@ var runner = function (schema, data, cb) {
// callback?
if (!cb) {
- return validate.errors ? false : true
+ return !validate.errors > 0
} else {
return cb(validate.errors ? new ValidationError(validate.errors) : null, valid)
}
diff --git a/node_modules/request/node_modules/har-validator/src/schemas/cacheEntry.json b/node_modules/request/node_modules/har-validator/src/schemas/cacheEntry.json
index dce27c5d8..a397439fd 100644
--- a/node_modules/request/node_modules/har-validator/src/schemas/cacheEntry.json
+++ b/node_modules/request/node_modules/har-validator/src/schemas/cacheEntry.json
@@ -1,25 +1,31 @@
{
- "optional": true,
- "required": [
- "lastAccess",
- "eTag",
- "hitCount"
- ],
- "properties": {
- "expires": {
- "type": "string"
- },
- "lastAccess": {
- "type": "string"
- },
- "eTag": {
- "type": "string"
- },
- "hitCount": {
- "type": "integer"
- },
- "comment": {
- "type": "string"
+ "oneOf": [{
+ "type": "object",
+ "optional": true,
+ "required": [
+ "lastAccess",
+ "eTag",
+ "hitCount"
+ ],
+ "properties": {
+ "expires": {
+ "type": "string"
+ },
+ "lastAccess": {
+ "type": "string"
+ },
+ "eTag": {
+ "type": "string"
+ },
+ "hitCount": {
+ "type": "integer"
+ },
+ "comment": {
+ "type": "string"
+ }
}
- }
+ }, {
+ "type": null,
+ "additionalProperties": false
+ }]
}
diff --git a/node_modules/request/node_modules/hawk/node_modules/boom/README.md b/node_modules/request/node_modules/hawk/node_modules/boom/README.md
index c28507d60..43f15626f 100755
--- a/node_modules/request/node_modules/hawk/node_modules/boom/README.md
+++ b/node_modules/request/node_modules/hawk/node_modules/boom/README.md
@@ -3,6 +3,7 @@
HTTP-friendly error objects
[![Build Status](https://secure.travis-ci.org/hapijs/boom.png)](http://travis-ci.org/hapijs/boom)
+[![Current Version](https://img.shields.io/npm/v/boom.svg)](https://www.npmjs.com/package/boom)
Lead Maintainer: [Adam Bretz](https://github.com/arb)
@@ -574,3 +575,9 @@ Generates the following response payload:
"message": "An internal server error occurred"
}
```
+
+## F.A.Q.
+
+###### How do I include extra information in my responses? `output.payload` is missing `data`, what gives?
+
+There is a reason the values passed back in the response payloads are pretty locked down. It's mostly for security and to not leak any important information back to the client. This means you will need to put in a little more effort to include extra information about your custom error. Check out the ["Error transformation"](https://github.com/hapijs/hapi/blob/master/API.md#error-transformation) section in the hapi documentation.
diff --git a/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js b/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
index 388cac768..256bf3222 100755
--- a/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
+++ b/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
@@ -27,17 +27,18 @@ exports.create = function (statusCode, message, data) {
internals.initialize = function (error, statusCode, message) {
- Hoek.assert(Hoek.isInteger(statusCode) && statusCode >= 400, 'First argument must be a number (400+):', statusCode);
+ var numberCode = parseInt(statusCode, 10);
+ Hoek.assert(!isNaN(numberCode) && numberCode >= 400, 'First argument must be a number (400+):', statusCode);
error.isBoom = true;
- error.isServer = statusCode >= 500;
+ error.isServer = numberCode >= 500;
if (!error.hasOwnProperty('data')) {
error.data = null;
}
error.output = {
- statusCode: statusCode,
+ statusCode: numberCode,
payload: {},
headers: {}
};
@@ -290,4 +291,3 @@ exports.badImplementation = function (message, data) {
err.isDeveloperError = true;
return err;
};
-
diff --git a/node_modules/request/node_modules/hawk/node_modules/boom/package.json b/node_modules/request/node_modules/hawk/node_modules/boom/package.json
index 59152fd7b..9619dface 100644
--- a/node_modules/request/node_modules/hawk/node_modules/boom/package.json
+++ b/node_modules/request/node_modules/hawk/node_modules/boom/package.json
@@ -1,7 +1,7 @@
{
"name": "boom",
"description": "HTTP-friendly error objects",
- "version": "2.7.0",
+ "version": "2.7.2",
"repository": {
"type": "git",
"url": "git://github.com/hapijs/boom"
@@ -25,22 +25,17 @@
"test": "lab -a code -t 100",
"test-cov-html": "lab -a code -r html -o coverage.html"
},
- "licenses": [
- {
- "type": "BSD",
- "url": "http://github.com/hapijs/boom/raw/master/LICENSE"
- }
- ],
- "gitHead": "fe25a73234007ebb4fa8f8071592f35240e67c1b",
+ "license": "BSD-3-Clause",
+ "gitHead": "29be188e9ecfce3a2e090b8714dec2b6e0791724",
"bugs": {
"url": "https://github.com/hapijs/boom/issues"
},
"homepage": "https://github.com/hapijs/boom",
- "_id": "boom@2.7.0",
- "_shasum": "47c6c7f62dc6d68742a75c4010b035c62615d265",
+ "_id": "boom@2.7.2",
+ "_shasum": "dad628d897f7fd2e32cc82197f13307971cf8354",
"_from": "boom@>=2.0.0 <3.0.0",
"_npmVersion": "2.7.0",
- "_nodeVersion": "0.10.36",
+ "_nodeVersion": "0.10.38",
"_npmUser": {
"name": "arb",
"email": "arbretz@gmail.com"
@@ -60,9 +55,9 @@
}
],
"dist": {
- "shasum": "47c6c7f62dc6d68742a75c4010b035c62615d265",
- "tarball": "http://registry.npmjs.org/boom/-/boom-2.7.0.tgz"
+ "shasum": "dad628d897f7fd2e32cc82197f13307971cf8354",
+ "tarball": "http://registry.npmjs.org/boom/-/boom-2.7.2.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/boom/-/boom-2.7.0.tgz"
+ "_resolved": "https://registry.npmjs.org/boom/-/boom-2.7.2.tgz"
}
diff --git a/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js b/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js
index f2b71276d..a0db4dff6 100755
--- a/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js
+++ b/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js
@@ -73,6 +73,22 @@ it('throws when statusCode is not a number', function (done) {
done();
});
+it('will cast a number-string to an integer', function (done) {
+
+ var codes = [
+ { input: '404', result: 404 },
+ { input: '404.1', result: 404 },
+ { input: 400, result: 400 },
+ { input: 400.123, result: 400 }]
+ for (var i = 0, il = codes.length; i < il; ++i) {
+ var code = codes[i];
+ var err = Boom.create(code.input);
+ expect(err.output.statusCode).to.equal(code.result);
+ }
+
+ done();
+});
+
it('throws when statusCode is not finite', function (done) {
expect(function () {
diff --git a/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json b/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json
index 3d56485df..3a2538621 100644
--- a/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json
+++ b/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json
@@ -10,7 +10,7 @@
"contributors": [],
"repository": {
"type": "git",
- "url": "git://github.com/hapijs/cryptiles"
+ "url": "git://github.com/hapijs/cryptiles.git"
},
"main": "index",
"keywords": [
@@ -36,29 +36,14 @@
"url": "http://github.com/hapijs/cryptiles/raw/master/LICENSE"
}
],
- "gitHead": "944263dbb628b9b3da542d35600d587f861eeaf0",
+ "readme": "cryptiles\n=========\n\nGeneral purpose crypto utilities\n\n[![Build Status](https://secure.travis-ci.org/hapijs/cryptiles.png)](http://travis-ci.org/hapijs/cryptiles)\n\n## Methods\n\n### `randomString(<Number> size)`\nReturns a cryptographically strong pseudo-random data string. Takes a size argument for the length of the string.\n\n### `fixedTimeComparison(<String> a, <String> b)`\nCompare two strings using fixed time algorithm (to prevent time-based analysis of MAC digest match). Returns `true` if the strings match, `false` if they differ.\n",
+ "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/hapijs/cryptiles/issues"
},
- "homepage": "https://github.com/hapijs/cryptiles",
+ "homepage": "https://github.com/hapijs/cryptiles#readme",
"_id": "cryptiles@2.0.4",
"_shasum": "09ea1775b9e1c7de7e60a99d42ab6f08ce1a1285",
- "_from": "cryptiles@>=2.0.0 <3.0.0",
- "_npmVersion": "1.4.23",
- "_npmUser": {
- "name": "hueniverse",
- "email": "eran@hueniverse.com"
- },
- "maintainers": [
- {
- "name": "hueniverse",
- "email": "eran@hueniverse.com"
- }
- ],
- "dist": {
- "shasum": "09ea1775b9e1c7de7e60a99d42ab6f08ce1a1285",
- "tarball": "http://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz"
+ "_resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz",
+ "_from": "cryptiles@>=2.0.0 <3.0.0"
}
diff --git a/node_modules/request/node_modules/hawk/node_modules/hoek/README.md b/node_modules/request/node_modules/hawk/node_modules/hoek/README.md
index b5f4d8a20..19357bb51 100755
--- a/node_modules/request/node_modules/hawk/node_modules/hoek/README.md
+++ b/node_modules/request/node_modules/hawk/node_modules/hoek/README.md
@@ -13,7 +13,7 @@ Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf)
* [clone](#cloneobj "clone")
* [cloneWithShallow](#clonewithshallowobj-keys "cloneWithShallow")
* [merge](#mergetarget-source-isnulloverride-ismergearrays "merge")
- * [applyToDefaults](#applytodefaultsdefaults-options "applyToDefaults")
+ * [applyToDefaults](#applytodefaultsdefaults-options-isnulloverride "applyToDefaults")
* [applyToDefaultsWithShallow](#applytodefaultswithshallowdefaults-options-keys "applyToDefaultsWithShallow")
* [deepEqual](#deepequala-b "deepEqual")
* [unique](#uniquearray-key "unique")
@@ -22,6 +22,7 @@ Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf)
* [contain](#containref-values-options "contain")
* [flatten](#flattenarray-target "flatten")
* [reach](#reachobj-chain-options "reach")
+ * [reachTemplate](#reachobj-template-options "reachTemplate")
* [transform](#transformobj-transform-options "transform")
* [shallow](#shallowobj "shallow")
* [stringify](#stringifyobj "stringify")
@@ -147,7 +148,8 @@ Hoek.merge(targetArray, sourceArray); // results in [1, 2, 3, 4, 5]
Hoek.merge(targetArray, sourceArray, true, false); // results in [4, 5]
```
-### applyToDefaults(defaults, options)
+### applyToDefaults(defaults, options, isNullOverride)
+isNullOverride defaults to false
Apply options to a copy of the defaults
@@ -159,6 +161,16 @@ var options = { port: 8080 };
var config = Hoek.applyToDefaults(defaults, options); // results in { host: "localhost", port: 8080 }
```
+Apply options with a null value to a copy of the defaults
+
+```javascript
+
+var defaults = { host: "localhost", port: 8000 };
+var options = { host: null, port: 8080 };
+
+var config = Hoek.applyToDefaults(defaults, options, true); // results in { host: null, port: 8080 }
+```
+
### applyToDefaultsWithShallow(defaults, options, keys)
keys is an array of key names to shallow copy
@@ -293,6 +305,23 @@ var obj = {a : {b : [2,3,6]}};
Hoek.reach(obj, chain); // returns 6
```
+### reachTemplate(obj, template, [options])
+
+Replaces string parameters (`{name}`) with their corresponding object key values by applying the
+(`reach()`)[#reachobj-chain-options] method where:
+
+- `obj` - the context object used for key lookup.
+- `template` - a string containing `{}` parameters.
+- `options` - optional (`reach()`)[#reachobj-chain-options] options.
+
+```javascript
+
+var chain = 'a.b.c';
+var obj = {a : {b : { c : 1}}};
+
+Hoek.reachTemplate(obj, '1+{a.b.c}=2'); // returns '1+1=2'
+```
+
### transform(obj, transform, [options])
Transforms an existing object into a new one based on the supplied `obj` and `transform` map. `options` are the same as the `reach` options.
diff --git a/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js b/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
index 02f8f42be..5f6f90c99 100755
--- a/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
+++ b/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
@@ -43,7 +43,9 @@ exports.clone = function (obj, seen) {
}
else {
var proto = Object.getPrototypeOf(obj);
- if (!proto || proto.isImmutable) {
+ if (proto &&
+ proto.isImmutable) {
+
newObj = obj;
}
else {
@@ -142,7 +144,7 @@ exports.merge = function (target, source, isNullOverride /* = true */, isMergeAr
// Apply options to a copy of the defaults
-exports.applyToDefaults = function (defaults, options) {
+exports.applyToDefaults = function (defaults, options, isNullOverride) {
exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');
exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');
@@ -157,7 +159,7 @@ exports.applyToDefaults = function (defaults, options) {
return copy;
}
- return exports.merge(copy, options, false, false);
+ return exports.merge(copy, options, isNullOverride === true, false);
};
@@ -280,12 +282,24 @@ exports.deepEqual = function (obj, ref, options, seen) {
return false;
}
- if (obj.length !== ref.length) {
+ if (!options.part && obj.length !== ref.length) {
return false;
}
for (var i = 0, il = obj.length; i < il; ++i) {
- if (!exports.deepEqual(obj[i], ref[i])) {
+ if (options.part) {
+ var found = false;
+ for (var r = 0, rl = ref.length; r < rl; ++r) {
+ if (exports.deepEqual(obj[i], ref[r], options, seen)) {
+ found = true;
+ break;
+ }
+ }
+
+ return found;
+ }
+
+ if (!exports.deepEqual(obj[i], ref[i], options, seen)) {
return false;
}
}
@@ -327,7 +341,7 @@ exports.deepEqual = function (obj, ref, options, seen) {
var keys = Object.getOwnPropertyNames(obj);
- if (keys.length !== Object.getOwnPropertyNames(ref).length) {
+ if (!options.part && keys.length !== Object.getOwnPropertyNames(ref).length) {
return false;
}
@@ -448,7 +462,23 @@ exports.contain = function (ref, values, options) {
exports.assert(typeof ref === 'string' || typeof ref === 'object', 'Reference must be string or an object');
exports.assert(values.length, 'Values array cannot be empty');
- var compare = options.deep ? exports.deepEqual : function (a, b) { return a === b; };
+ var compare, compareFlags;
+ if (options.deep) {
+ compare = exports.deepEqual;
+
+ var hasOnly = options.hasOwnProperty('only'), hasPart = options.hasOwnProperty('part');
+
+ compareFlags = {
+ prototype: hasOnly ? options.only : hasPart ? !options.part : false,
+ part: hasOnly ? !options.only : hasPart ? options.part : true
+ };
+ }
+ else {
+ compare = function (a, b) {
+
+ return a === b;
+ };
+ }
var misses = false;
var matches = new Array(values.length);
@@ -477,7 +507,7 @@ exports.contain = function (ref, values, options) {
else if (Array.isArray(ref)) {
for (i = 0, il = ref.length; i < il; ++i) {
for (var j = 0, jl = values.length, matched = false; j < jl && matched === false; ++j) {
- matched = compare(ref[i], values[j]) && j;
+ matched = compare(values[j], ref[i], compareFlags) && j;
}
if (matched !== false) {
@@ -495,7 +525,7 @@ exports.contain = function (ref, values, options) {
var pos = values.indexOf(key);
if (pos !== -1) {
if (valuePairs &&
- !compare(ref[key], valuePairs[key])) {
+ !compare(valuePairs[key], ref[key], compareFlags)) {
return false;
}
@@ -582,6 +612,16 @@ exports.reach = function (obj, chain, options) {
};
+exports.reachTemplate = function (obj, template, options) {
+
+ return template.replace(/{([^}]+)}/g, function ($0, chain) {
+
+ var value = exports.reach(obj, chain, options);
+ return (value === undefined || value === null ? '' : value);
+ });
+};
+
+
exports.formatStack = function (stack) {
var trace = [];
diff --git a/node_modules/request/node_modules/hawk/node_modules/hoek/package.json b/node_modules/request/node_modules/hawk/node_modules/hoek/package.json
index c2f8514e9..5ac4084ba 100644
--- a/node_modules/request/node_modules/hawk/node_modules/hoek/package.json
+++ b/node_modules/request/node_modules/hawk/node_modules/hoek/package.json
@@ -1,10 +1,10 @@
{
"name": "hoek",
"description": "General purpose node utilities",
- "version": "2.12.0",
+ "version": "2.14.0",
"repository": {
"type": "git",
- "url": "git://github.com/hapijs/hoek"
+ "url": "git://github.com/hapijs/hoek.git"
},
"main": "index",
"keywords": [
@@ -21,26 +21,25 @@
"scripts": {
"test": "make test-cov"
},
- "licenses": [
- {
- "type": "BSD",
- "url": "http://github.com/hapijs/hoek/raw/master/LICENSE"
- }
- ],
- "gitHead": "9bbb8f149b5b824f66b47ae4cf3afb1e2877396f",
+ "license": "BSD-3-Clause",
+ "gitHead": "e80875a516f4b0eaa757ac4814c4510eebdcf589",
"bugs": {
"url": "https://github.com/hapijs/hoek/issues"
},
- "homepage": "https://github.com/hapijs/hoek",
- "_id": "hoek@2.12.0",
- "_shasum": "5d1196e0bf20c5cec957e8927101164effdaf1c9",
+ "homepage": "https://github.com/hapijs/hoek#readme",
+ "_id": "hoek@2.14.0",
+ "_shasum": "81211691f52a5a835ae49edbf1e89c9003476aa4",
"_from": "hoek@>=2.0.0 <3.0.0",
- "_npmVersion": "2.6.1",
- "_nodeVersion": "0.10.36",
+ "_npmVersion": "2.9.0",
+ "_nodeVersion": "0.12.2",
"_npmUser": {
"name": "nlf",
"email": "quitlahok@gmail.com"
},
+ "dist": {
+ "shasum": "81211691f52a5a835ae49edbf1e89c9003476aa4",
+ "tarball": "http://registry.npmjs.org/hoek/-/hoek-2.14.0.tgz"
+ },
"maintainers": [
{
"name": "hueniverse",
@@ -55,10 +54,6 @@
"email": "quitlahok@gmail.com"
}
],
- "dist": {
- "shasum": "5d1196e0bf20c5cec957e8927101164effdaf1c9",
- "tarball": "http://registry.npmjs.org/hoek/-/hoek-2.12.0.tgz"
- },
"directories": {},
- "_resolved": "https://registry.npmjs.org/hoek/-/hoek-2.12.0.tgz"
+ "_resolved": "https://registry.npmjs.org/hoek/-/hoek-2.14.0.tgz"
}
diff --git a/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js b/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js
index 1c45a601a..3261ae8c6 100755
--- a/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js
+++ b/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js
@@ -20,70 +20,70 @@ var it = lab.test;
var expect = Code.expect;
-var nestedObj = {
+var nestedObj = {
v: [7, 8, 9],
w: /^something$/igm,
- x: {
+ x: {
a: [1, 2, 3],
b: 123456,
c: new Date(),
d: /hi/igm,
- e: /hello/
+ e: /hello/
},
y: 'y',
- z: new Date(1378775452757)
+ z: new Date(1378775452757)
};
var dupsArray = [nestedObj, { z: 'z' }, nestedObj];
var reducedDupsArray = [nestedObj, { z: 'z' }];
-describe('clone()', function () {
+describe('clone()', function () {
- it('clones a nested object', function (done) {
+ it('clones a nested object', function (done) {
var a = nestedObj;
var b = Hoek.clone(a);
expect(a).to.deep.equal(b);
expect(a.z.getTime()).to.equal(b.z.getTime());
- done();
+ done();
});
- it('clones a null object', function (done) {
+ it('clones a null object', function (done) {
var b = Hoek.clone(null);
expect(b).to.equal(null);
- done();
+ done();
});
- it('should not convert undefined properties to null', function (done) {
+ it('should not convert undefined properties to null', function (done) {
var obj = { something: undefined };
var b = Hoek.clone(obj);
expect(typeof b.something).to.equal('undefined');
- done();
+ done();
});
- it('should not throw on circular reference', function (done) {
+ it('should not throw on circular reference', function (done) {
var a = {};
a.x = a;
- var test = function () {
+ var test = function () {
- var b = Hoek.clone(a);
+ var b = Hoek.clone(a);
};
expect(test).to.not.throw();
- done();
+ done();
});
- it('clones circular reference', function (done) {
+ it('clones circular reference', function (done) {
- var x = {
- 'z': new Date()
+ var x = {
+ 'z': new Date()
};
x.y = x;
@@ -94,50 +94,50 @@ describe('clone()', function () {
expect(b.y.z).to.not.equal(x.y.z);
expect(b.y).to.equal(b);
expect(b.y.y.y.y).to.equal(b);
- done();
+ done();
});
- it('clones an object with a null prototype', function (done) {
+ it('clones an object with a null prototype', function (done) {
var obj = Object.create(null);
var b = Hoek.clone(obj);
expect(b).to.deep.equal(obj);
- done();
+ done();
});
- it('clones deeply nested object', function (done) {
+ it('clones deeply nested object', function (done) {
- var a = {
- x: {
- y: {
+ var a = {
+ x: {
+ y: {
a: [1, 2, 3],
b: 123456,
c: new Date(),
d: /hi/igm,
- e: /hello/
- }
- }
+ e: /hello/
+ }
+ }
};
var b = Hoek.clone(a);
expect(a).to.deep.equal(b);
expect(a.x.y.c.getTime()).to.equal(b.x.y.c.getTime());
- done();
+ done();
});
- it('clones arrays', function (done) {
+ it('clones arrays', function (done) {
var a = [1, 2, 3];
var b = Hoek.clone(a);
expect(a).to.deep.equal(b);
- done();
+ done();
});
- it('performs actual copy for shallow keys (no pass by reference)', function (done) {
+ it('performs actual copy for shallow keys (no pass by reference)', function (done) {
var x = Hoek.clone(nestedObj);
var y = Hoek.clone(nestedObj);
@@ -159,10 +159,10 @@ describe('clone()', function () {
expect(x.y).to.not.equal(nestedObj.y);
expect(x.y).to.not.equal(y.y);
- done();
+ done();
});
- it('performs actual copy for deep keys (no pass by reference)', function (done) {
+ it('performs actual copy for deep keys (no pass by reference)', function (done) {
var x = Hoek.clone(nestedObj);
var y = Hoek.clone(nestedObj);
@@ -172,17 +172,23 @@ describe('clone()', function () {
expect(x.x.c.getTime()).to.equal(nestedObj.x.c.getTime());
expect(x.x.c.getTime()).to.equal(y.x.c.getTime());
- done();
+ done();
});
- it('copies functions with properties', function (done) {
+ it('copies functions with properties', function (done) {
- var a = {
- x: function () { return 1; },
- y: {}
+ var a = {
+ x: function () {
+
+ return 1;
+ },
+ y: {}
};
a.x.z = 'string in function';
- a.x.v = function () { return 2; };
+ a.x.v = function () {
+
+ return 2;
+ };
a.y.u = a.x;
var b = Hoek.clone(a);
@@ -190,13 +196,14 @@ describe('clone()', function () {
expect(b.x.v()).to.equal(2);
expect(b.y.u).to.equal(b.x);
expect(b.x.z).to.equal('string in function');
- done();
+ done();
});
it('should copy a buffer', function (done) {
+
var tls = {
key: new Buffer([1, 2, 3, 4, 5]),
- cert: new Buffer([1, 2, 3, 4, 5, 6, 10])
+ cert: new Buffer([1, 2, 3, 4, 5, 6, 10])
};
var copiedTls = Hoek.clone(tls);
@@ -204,17 +211,20 @@ describe('clone()', function () {
expect(JSON.stringify(copiedTls.key)).to.equal(JSON.stringify(tls.key));
expect(Buffer.isBuffer(copiedTls.cert)).to.equal(true);
expect(JSON.stringify(copiedTls.cert)).to.equal(JSON.stringify(tls.cert));
- done();
+ done();
});
- it('clones an object with a prototype', function (done) {
+ it('clones an object with a prototype', function (done) {
- var Obj = function () {
+ var Obj = function () {
- this.a = 5;
+ this.a = 5;
};
- Obj.prototype.b = function () { return 'c'; };
+ Obj.prototype.b = function () {
+
+ return 'c';
+ };
var a = new Obj();
var b = Hoek.clone(a);
@@ -222,34 +232,38 @@ describe('clone()', function () {
expect(b.a).to.equal(5);
expect(b.b()).to.equal('c');
expect(a).to.deep.equal(b);
- done();
+ done();
});
- it('reuses cloned Date object', function (done) {
+ it('reuses cloned Date object', function (done) {
- var obj = {
- a: new Date()
+ var obj = {
+ a: new Date()
};
obj.b = obj.a;
var copy = Hoek.clone(obj);
expect(copy.a).to.equal(copy.b);
- done();
+ done();
});
- it('shallow copies an object with a prototype and isImmutable flag', function (done) {
+ it('shallow copies an object with a prototype and isImmutable flag', function (done) {
+
+ var Obj = function () {
- var Obj = function () {
+ this.value = 5;
+ };
- this.value = 5;
+ Obj.prototype.b = function () {
+
+ return 'c';
};
- Obj.prototype.b = function () { return 'c'; };
Obj.prototype.isImmutable = true;
- var obj = {
- a: new Obj()
+ var obj = {
+ a: new Obj()
};
var copy = Hoek.clone(obj);
@@ -258,117 +272,117 @@ describe('clone()', function () {
expect(copy.a.value).to.equal(5);
expect(copy.a.b()).to.equal('c');
expect(obj.a).to.equal(copy.a);
- done();
+ done();
});
- it('clones an object with property getter without executing it', function (done) {
+ it('clones an object with property getter without executing it', function (done) {
var obj = {};
var value = 1;
var execCount = 0;
- Object.defineProperty(obj, 'test', {
+ Object.defineProperty(obj, 'test', {
enumerable: true,
configurable: true,
- get: function () {
+ get: function () {
++execCount;
- return value;
- }
+ return value;
+ }
});
var copy = Hoek.clone(obj);
expect(execCount).to.equal(0);
expect(copy.test).to.equal(1);
expect(execCount).to.equal(1);
- done();
+ done();
});
- it('clones an object with property getter and setter', function (done) {
+ it('clones an object with property getter and setter', function (done) {
- var obj = {
- _test: 0
+ var obj = {
+ _test: 0
};
- Object.defineProperty(obj, 'test', {
+ Object.defineProperty(obj, 'test', {
enumerable: true,
configurable: true,
- get: function () {
+ get: function () {
- return this._test;
+ return this._test;
},
- set: function (value) {
+ set: function (value) {
- this._test = value - 1;
- }
+ this._test = value - 1;
+ }
});
var copy = Hoek.clone(obj);
expect(copy.test).to.equal(0);
copy.test = 5;
expect(copy.test).to.equal(4);
- done();
+ done();
});
- it('clones an object with only property setter', function (done) {
+ it('clones an object with only property setter', function (done) {
- var obj = {
- _test: 0
+ var obj = {
+ _test: 0
};
- Object.defineProperty(obj, 'test', {
+ Object.defineProperty(obj, 'test', {
enumerable: true,
configurable: true,
- set: function (value) {
+ set: function (value) {
- this._test = value - 1;
- }
+ this._test = value - 1;
+ }
});
var copy = Hoek.clone(obj);
expect(copy._test).to.equal(0);
copy.test = 5;
expect(copy._test).to.equal(4);
- done();
+ done();
});
- it('clones an object with non-enumerable properties', function (done) {
+ it('clones an object with non-enumerable properties', function (done) {
- var obj = {
- _test: 0
+ var obj = {
+ _test: 0
};
- Object.defineProperty(obj, 'test', {
+ Object.defineProperty(obj, 'test', {
enumerable: false,
configurable: true,
- set: function (value) {
+ set: function (value) {
- this._test = value - 1;
- }
+ this._test = value - 1;
+ }
});
var copy = Hoek.clone(obj);
expect(copy._test).to.equal(0);
copy.test = 5;
expect(copy._test).to.equal(4);
- done();
- });
+ done();
+ });
});
-describe('merge()', function () {
+describe('merge()', function () {
- it('deep copies source items', function (done) {
+ it('deep copies source items', function (done) {
- var target = {
+ var target = {
b: 3,
- d: []
+ d: []
};
- var source = {
- c: {
- d: 1
+ var source = {
+ c: {
+ d: 1
},
- d: [{ e: 1 }]
+ d: [{ e: 1 }]
};
Hoek.merge(target, source);
@@ -377,123 +391,123 @@ describe('merge()', function () {
expect(target.d).to.not.equal(source.d);
expect(target.d[0]).to.not.equal(source.d[0]);
expect(target.d).to.deep.equal(source.d);
- done();
+ done();
});
- it('merges array over an object', function (done) {
+ it('merges array over an object', function (done) {
- var a = {
- x: ['n', 'm']
+ var a = {
+ x: ['n', 'm']
};
- var b = {
- x: {
+ var b = {
+ x: {
n: '1',
- m: '2'
- }
+ m: '2'
+ }
};
Hoek.merge(b, a);
expect(a.x[0]).to.equal('n');
expect(a.x.n).to.not.exist();
- done();
+ done();
});
- it('merges object over an array', function (done) {
+ it('merges object over an array', function (done) {
- var a = {
- x: ['n', 'm']
+ var a = {
+ x: ['n', 'm']
};
- var b = {
- x: {
+ var b = {
+ x: {
n: '1',
- m: '2'
- }
+ m: '2'
+ }
};
Hoek.merge(a, b);
expect(a.x.n).to.equal('1');
expect(a.x[0]).to.not.exist();
- done();
+ done();
});
- it('does not throw if source is null', function (done) {
+ it('does not throw if source is null', function (done) {
var a = {};
var b = null;
var c = null;
- expect(function () {
+ expect(function () {
- c = Hoek.merge(a, b);
+ c = Hoek.merge(a, b);
}).to.not.throw();
expect(c).to.equal(a);
- done();
+ done();
});
- it('does not throw if source is undefined', function (done) {
+ it('does not throw if source is undefined', function (done) {
var a = {};
var b;
var c = null;
- expect(function () {
+ expect(function () {
- c = Hoek.merge(a, b);
+ c = Hoek.merge(a, b);
}).to.not.throw();
expect(c).to.equal(a);
- done();
+ done();
});
- it('throws if source is not an object', function (done) {
+ it('throws if source is not an object', function (done) {
- expect(function () {
+ expect(function () {
var a = {};
var b = 0;
- Hoek.merge(a, b);
+ Hoek.merge(a, b);
}).to.throw('Invalid source value: must be null, undefined, or an object');
- done();
+ done();
});
- it('throws if target is not an object', function (done) {
+ it('throws if target is not an object', function (done) {
- expect(function () {
+ expect(function () {
var a = 0;
var b = {};
- Hoek.merge(a, b);
+ Hoek.merge(a, b);
}).to.throw('Invalid target value: must be an object');
- done();
+ done();
});
- it('throws if target is not an array and source is', function (done) {
+ it('throws if target is not an array and source is', function (done) {
- expect(function () {
+ expect(function () {
var a = {};
var b = [1, 2];
- Hoek.merge(a, b);
+ Hoek.merge(a, b);
}).to.throw('Cannot merge array onto an object');
- done();
+ done();
});
- it('returns the same object when merging arrays', function (done) {
+ it('returns the same object when merging arrays', function (done) {
var a = [];
var b = [1, 2];
expect(Hoek.merge(a, b)).to.equal(a);
- done();
+ done();
});
- it('combines an empty object with a non-empty object', function (done) {
+ it('combines an empty object with a non-empty object', function (done) {
var a = {};
var b = nestedObj;
@@ -501,10 +515,10 @@ describe('merge()', function () {
var c = Hoek.merge(a, b);
expect(a).to.deep.equal(b);
expect(c).to.deep.equal(b);
- done();
+ done();
});
- it('overrides values in target', function (done) {
+ it('overrides values in target', function (done) {
var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };
var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };
@@ -516,10 +530,10 @@ describe('merge()', function () {
expect(c.v).to.equal(0);
expect(c.m).to.equal('123');
expect(c.t).to.deep.equal({ u: 6 });
- done();
+ done();
});
- it('overrides values in target (flip)', function (done) {
+ it('overrides values in target (flip)', function (done) {
var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };
var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };
@@ -531,98 +545,98 @@ describe('merge()', function () {
expect(d.v).to.equal(5);
expect(d.m).to.equal('abc');
expect(d.t).to.deep.equal('test');
- done();
+ done();
});
- it('retains Date properties', function (done) {
+ it('retains Date properties', function (done) {
var a = { x: new Date(1378776452757) };
var b = Hoek.merge({}, a);
expect(a.x.getTime()).to.equal(b.x.getTime());
- done();
+ done();
});
- it('retains Date properties when merging keys', function (done) {
+ it('retains Date properties when merging keys', function (done) {
var a = { x: new Date(1378776452757) };
var b = Hoek.merge({ x: {} }, a);
expect(a.x.getTime()).to.equal(b.x.getTime());
- done();
+ done();
});
- it('overrides Buffer', function (done) {
+ it('overrides Buffer', function (done) {
var a = { x: new Buffer('abc') };
var b = Hoek.merge({ x: {} }, a);
expect(a.x.toString()).to.equal('abc');
- done();
- });
+ done();
+ });
});
-describe('applyToDefaults()', function () {
+describe('applyToDefaults()', function () {
- var defaults = {
+ var defaults = {
a: 1,
b: 2,
- c: {
+ c: {
d: 3,
- e: [5, 6]
+ e: [5, 6]
},
f: 6,
- g: 'test'
+ g: 'test'
};
- it('throws when target is null', function (done) {
+ it('throws when target is null', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.applyToDefaults(null, {});
+ Hoek.applyToDefaults(null, {});
}).to.throw('Invalid defaults value: must be an object');
- done();
+ done();
});
- it('returns null if options is false', function (done) {
+ it('returns null if options is false', function (done) {
var result = Hoek.applyToDefaults(defaults, false);
expect(result).to.equal(null);
- done();
+ done();
});
- it('returns null if options is null', function (done) {
+ it('returns null if options is null', function (done) {
var result = Hoek.applyToDefaults(defaults, null);
expect(result).to.equal(null);
- done();
+ done();
});
- it('returns null if options is undefined', function (done) {
+ it('returns null if options is undefined', function (done) {
var result = Hoek.applyToDefaults(defaults, undefined);
expect(result).to.equal(null);
- done();
+ done();
});
- it('returns a copy of defaults if options is true', function (done) {
+ it('returns a copy of defaults if options is true', function (done) {
var result = Hoek.applyToDefaults(defaults, true);
expect(result).to.deep.equal(defaults);
- done();
+ done();
});
- it('applies object to defaults', function (done) {
+ it('applies object to defaults', function (done) {
- var obj = {
+ var obj = {
a: null,
- c: {
- e: [4]
+ c: {
+ e: [4]
},
f: 0,
- g: {
- h: 5
- }
+ g: {
+ h: 5
+ }
};
var result = Hoek.applyToDefaults(defaults, obj);
@@ -631,21 +645,43 @@ describe('applyToDefaults()', function () {
expect(result.b).to.equal(2);
expect(result.f).to.equal(0);
expect(result.g).to.deep.equal({ h: 5 });
- done();
+ done();
});
+
+ it('applies object to defaults with null', function (done) {
+
+ var obj = {
+ a: null,
+ c: {
+ e: [4]
+ },
+ f: 0,
+ g: {
+ h: 5
+ }
+ };
+
+ var result = Hoek.applyToDefaults(defaults, obj, true);
+ expect(result.c.e).to.deep.equal([4]);
+ expect(result.a).to.equal(null);
+ expect(result.b).to.equal(2);
+ expect(result.f).to.equal(0);
+ expect(result.g).to.deep.equal({ h: 5 });
+ done();
+ });
});
-describe('cloneWithShallow()', function () {
+describe('cloneWithShallow()', function () {
- it('deep clones except for listed keys', function (done) {
+ it('deep clones except for listed keys', function (done) {
- var source = {
- a: {
- b: 5
+ var source = {
+ a: {
+ b: 5
},
- c: {
- d: 6
- }
+ c: {
+ d: 6
+ }
};
var copy = Hoek.cloneWithShallow(source, ['c']);
@@ -653,36 +689,36 @@ describe('cloneWithShallow()', function () {
expect(copy).to.not.equal(source);
expect(copy.a).to.not.equal(source.a);
expect(copy.b).to.equal(source.b);
- done();
+ done();
});
- it('returns immutable value', function (done) {
+ it('returns immutable value', function (done) {
expect(Hoek.cloneWithShallow(5)).to.equal(5);
- done();
+ done();
});
- it('returns null value', function (done) {
+ it('returns null value', function (done) {
expect(Hoek.cloneWithShallow(null)).to.equal(null);
- done();
+ done();
});
- it('returns undefined value', function (done) {
+ it('returns undefined value', function (done) {
expect(Hoek.cloneWithShallow(undefined)).to.equal(undefined);
- done();
+ done();
});
- it('deep clones except for listed keys (including missing keys)', function (done) {
+ it('deep clones except for listed keys (including missing keys)', function (done) {
- var source = {
- a: {
- b: 5
+ var source = {
+ a: {
+ b: 5
},
- c: {
- d: 6
- }
+ c: {
+ d: 6
+ }
};
var copy = Hoek.cloneWithShallow(source, ['c', 'v']);
@@ -690,33 +726,33 @@ describe('cloneWithShallow()', function () {
expect(copy).to.not.equal(source);
expect(copy.a).to.not.equal(source.a);
expect(copy.b).to.equal(source.b);
- done();
- });
+ done();
+ });
});
-describe('applyToDefaultsWithShallow()', function () {
+describe('applyToDefaultsWithShallow()', function () {
- it('shallow copies the listed keys from options without merging', function (done) {
+ it('shallow copies the listed keys from options without merging', function (done) {
- var defaults = {
- a: {
+ var defaults = {
+ a: {
b: 5,
- e: 3
+ e: 3
},
- c: {
+ c: {
d: 7,
- g: 1
- }
+ g: 1
+ }
};
- var options = {
- a: {
- b: 4
+ var options = {
+ a: {
+ b: 4
},
- c: {
+ c: {
d: 6,
- f: 7
- }
+ f: 7
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['a']);
@@ -725,235 +761,235 @@ describe('applyToDefaultsWithShallow()', function () {
expect(merged.a).to.not.equal(defaults.a);
expect(merged.c).to.not.equal(options.c);
expect(merged.c).to.not.equal(defaults.c);
- done();
+ done();
});
- it('shallow copies the nested keys (override)', function (done) {
+ it('shallow copies the nested keys (override)', function (done) {
- var defaults = {
- a: {
- b: 5
+ var defaults = {
+ a: {
+ b: 5
},
- c: {
+ c: {
d: 7,
- g: 1
- }
+ g: 1
+ }
};
- var options = {
- a: {
- b: 4
+ var options = {
+ a: {
+ b: 4
},
- c: {
+ c: {
d: 6,
- g: {
- h: 8
- }
- }
+ g: {
+ h: 8
+ }
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
expect(merged).to.deep.equal({ a: { b: 4 }, c: { d: 6, g: { h: 8 } } });
expect(merged.c.g).to.equal(options.c.g);
- done();
+ done();
});
- it('shallow copies the nested keys (missing)', function (done) {
+ it('shallow copies the nested keys (missing)', function (done) {
- var defaults = {
- a: {
- b: 5
- }
+ var defaults = {
+ a: {
+ b: 5
+ }
};
- var options = {
- a: {
- b: 4
+ var options = {
+ a: {
+ b: 4
},
- c: {
- g: {
- h: 8
- }
- }
+ c: {
+ g: {
+ h: 8
+ }
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { h: 8 } } });
expect(merged.c.g).to.equal(options.c.g);
- done();
+ done();
});
- it('shallow copies the nested keys (override)', function (done) {
+ it('shallow copies the nested keys (override)', function (done) {
- var defaults = {
- a: {
- b: 5
+ var defaults = {
+ a: {
+ b: 5
},
- c: {
- g: {
- d: 7
- }
- }
+ c: {
+ g: {
+ d: 7
+ }
+ }
};
- var options = {
- a: {
- b: 4
+ var options = {
+ a: {
+ b: 4
},
- c: {
- g: {
- h: 8
- }
- }
+ c: {
+ g: {
+ h: 8
+ }
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { h: 8 } } });
expect(merged.c.g).to.equal(options.c.g);
- done();
+ done();
});
- it('shallow copies the nested keys (deeper)', function (done) {
+ it('shallow copies the nested keys (deeper)', function (done) {
- var defaults = {
- a: {
- b: 5
- }
+ var defaults = {
+ a: {
+ b: 5
+ }
};
- var options = {
- a: {
- b: 4
+ var options = {
+ a: {
+ b: 4
},
- c: {
- g: {
- r: {
- h: 8
- }
- }
- }
+ c: {
+ g: {
+ r: {
+ h: 8
+ }
+ }
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g.r']);
expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { r: { h: 8 } } } });
expect(merged.c.g.r).to.equal(options.c.g.r);
- done();
+ done();
});
- it('shallow copies the nested keys (not present)', function (done) {
+ it('shallow copies the nested keys (not present)', function (done) {
- var defaults = {
- a: {
- b: 5
- }
+ var defaults = {
+ a: {
+ b: 5
+ }
};
- var options = {
- a: {
- b: 4
+ var options = {
+ a: {
+ b: 4
},
- c: {
- g: {
- r: {
- h: 8
- }
- }
- }
+ c: {
+ g: {
+ r: {
+ h: 8
+ }
+ }
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['x.y']);
expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { r: { h: 8 } } } });
- done();
+ done();
});
- it('shallow copies the listed keys in the defaults', function (done) {
+ it('shallow copies the listed keys in the defaults', function (done) {
- var defaults = {
- a: {
- b: 1
- }
+ var defaults = {
+ a: {
+ b: 1
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, {}, ['a']);
expect(merged.a).to.equal(defaults.a);
- done();
+ done();
});
- it('shallow copies the listed keys in the defaults (true)', function (done) {
+ it('shallow copies the listed keys in the defaults (true)', function (done) {
- var defaults = {
- a: {
- b: 1
- }
+ var defaults = {
+ a: {
+ b: 1
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, true, ['a']);
expect(merged.a).to.equal(defaults.a);
- done();
+ done();
});
- it('returns null on false', function (done) {
+ it('returns null on false', function (done) {
- var defaults = {
- a: {
- b: 1
- }
+ var defaults = {
+ a: {
+ b: 1
+ }
};
var merged = Hoek.applyToDefaultsWithShallow(defaults, false, ['a']);
expect(merged).to.equal(null);
- done();
+ done();
});
- it('throws on missing defaults', function (done) {
+ it('throws on missing defaults', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.applyToDefaultsWithShallow(null, {}, ['a']);
+ Hoek.applyToDefaultsWithShallow(null, {}, ['a']);
}).to.throw('Invalid defaults value: must be an object');
- done();
+ done();
});
- it('throws on invalid defaults', function (done) {
+ it('throws on invalid defaults', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.applyToDefaultsWithShallow('abc', {}, ['a']);
+ Hoek.applyToDefaultsWithShallow('abc', {}, ['a']);
}).to.throw('Invalid defaults value: must be an object');
- done();
+ done();
});
- it('throws on invalid options', function (done) {
+ it('throws on invalid options', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.applyToDefaultsWithShallow({}, 'abc', ['a']);
+ Hoek.applyToDefaultsWithShallow({}, 'abc', ['a']);
}).to.throw('Invalid options value: must be true, falsy or an object');
- done();
+ done();
});
- it('throws on missing keys', function (done) {
+ it('throws on missing keys', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.applyToDefaultsWithShallow({}, true);
+ Hoek.applyToDefaultsWithShallow({}, true);
}).to.throw('Invalid keys');
- done();
+ done();
});
- it('throws on invalid keys', function (done) {
+ it('throws on invalid keys', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.applyToDefaultsWithShallow({}, true, 'a');
+ Hoek.applyToDefaultsWithShallow({}, true, 'a');
}).to.throw('Invalid keys');
- done();
- });
+ done();
+ });
});
-describe('deepEqual()', function () {
+describe('deepEqual()', function () {
- it('compares simple values', function (done) {
+ it('compares simple values', function (done) {
expect(Hoek.deepEqual('x', 'x')).to.be.true();
expect(Hoek.deepEqual('x', 'y')).to.be.false();
@@ -967,10 +1003,10 @@ describe('deepEqual()', function () {
expect(Hoek.deepEqual(-1, 1)).to.be.false();
expect(Hoek.deepEqual(NaN, 0)).to.be.false();
expect(Hoek.deepEqual(NaN, NaN)).to.be.true();
- done();
+ done();
});
- it('compares different types', function (done) {
+ it('compares different types', function (done) {
expect(Hoek.deepEqual([], 5)).to.be.false();
expect(Hoek.deepEqual(5, [])).to.be.false();
@@ -978,116 +1014,116 @@ describe('deepEqual()', function () {
expect(Hoek.deepEqual(null, {})).to.be.false();
expect(Hoek.deepEqual('abc', {})).to.be.false();
expect(Hoek.deepEqual({}, 'abc')).to.be.false();
- done();
+ done();
});
- it('compares empty structures', function (done) {
+ it('compares empty structures', function (done) {
expect(Hoek.deepEqual([], [])).to.be.true();
expect(Hoek.deepEqual({}, {})).to.be.true();
expect(Hoek.deepEqual([], {})).to.be.false();
- done();
+ done();
});
- it('compares empty arguments object', function (done) {
+ it('compares empty arguments object', function (done) {
- var compare = function () {
+ var compare = function () {
- expect(Hoek.deepEqual([], arguments)).to.be.false();
+ expect(Hoek.deepEqual([], arguments)).to.be.false();
};
compare();
- done();
+ done();
});
- it('compares empty arguments objects', function (done) {
+ it('compares empty arguments objects', function (done) {
- var compare = function () {
+ var compare = function () {
var arg1 = arguments;
- var inner = function () {
+ var inner = function () {
expect(Hoek.deepEqual(arg1, arguments)).to.be.false(); // callee is not the same
};
- inner();
+ inner();
};
compare();
- done();
+ done();
});
- it('compares dates', function (done) {
+ it('compares dates', function (done) {
expect(Hoek.deepEqual(new Date(2015, 1, 1), new Date(2015, 1, 1))).to.be.true();
expect(Hoek.deepEqual(new Date(100), new Date(101))).to.be.false();
expect(Hoek.deepEqual(new Date(), {})).to.be.false();
- done();
+ done();
});
- it('compares regular expressions', function (done) {
+ it('compares regular expressions', function (done) {
expect(Hoek.deepEqual(/\s/, new RegExp('\\\s'))).to.be.true();
expect(Hoek.deepEqual(/\s/g, /\s/g)).to.be.true();
expect(Hoek.deepEqual(/a/, {})).to.be.false();
expect(Hoek.deepEqual(/\s/g, /\s/i)).to.be.false();
expect(Hoek.deepEqual(/a/g, /b/g)).to.be.false();
- done();
+ done();
});
- it('compares arrays', function (done) {
+ it('compares arrays', function (done) {
expect(Hoek.deepEqual([[1]], [[1]])).to.be.true();
expect(Hoek.deepEqual([1, 2, 3], [1, 2, 3])).to.be.true();
expect(Hoek.deepEqual([1, 2, 3], [1, 3, 2])).to.be.false();
expect(Hoek.deepEqual([1, 2, 3], [1, 2])).to.be.false();
expect(Hoek.deepEqual([1], [1])).to.be.true();
- done();
+ done();
});
- it('compares buffers', function (done) {
+ it('compares buffers', function (done) {
expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 2, 3]))).to.be.true();
expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 3, 2]))).to.be.false();
expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 2]))).to.be.false();
expect(Hoek.deepEqual(new Buffer([1, 2, 3]), {})).to.be.false();
expect(Hoek.deepEqual(new Buffer([1, 2, 3]), [1, 2, 3])).to.be.false();
- done();
+ done();
});
- it('compares objects', function (done) {
+ it('compares objects', function (done) {
expect(Hoek.deepEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 })).to.be.true();
expect(Hoek.deepEqual({ foo: 'bar' }, { foo: 'baz' })).to.be.false();
expect(Hoek.deepEqual({ foo: { bar: 'foo' } }, { foo: { bar: 'baz' } })).to.be.false();
- done();
+ done();
});
- it('handles circular dependency', function (done) {
+ it('handles circular dependency', function (done) {
var a = {};
a.x = a;
var b = Hoek.clone(a);
expect(Hoek.deepEqual(a, b)).to.be.true();
- done();
+ done();
});
- it('compares an object with property getter without executing it', function (done) {
+ it('compares an object with property getter without executing it', function (done) {
var obj = {};
var value = 1;
var execCount = 0;
- Object.defineProperty(obj, 'test', {
+ Object.defineProperty(obj, 'test', {
enumerable: true,
configurable: true,
- get: function () {
+ get: function () {
++execCount;
- return value;
- }
+ return value;
+ }
});
var copy = Hoek.clone(obj);
@@ -1095,52 +1131,64 @@ describe('deepEqual()', function () {
expect(execCount).to.equal(0);
expect(copy.test).to.equal(1);
expect(execCount).to.equal(1);
- done();
+ done();
});
- it('compares objects with property getters', function (done) {
+ it('compares objects with property getters', function (done) {
var obj = {};
- Object.defineProperty(obj, 'test', {
+ Object.defineProperty(obj, 'test', {
enumerable: true,
configurable: true,
- get: function () { return 1; }
+ get: function () {
+
+ return 1;
+ }
});
var ref = {};
- Object.defineProperty(ref, 'test', {
+ Object.defineProperty(ref, 'test', {
enumerable: true,
configurable: true,
- get: function () { return 2; }
+ get: function () {
+
+ return 2;
+ }
});
expect(Hoek.deepEqual(obj, ref)).to.be.false();
- done();
+ done();
});
- it('compares object prototypes', function (done) {
+ it('compares object prototypes', function (done) {
- var Obj = function () {
+ var Obj = function () {
- this.a = 5;
+ this.a = 5;
};
- Obj.prototype.b = function () { return this.a; };
+ Obj.prototype.b = function () {
+
+ return this.a;
+ };
- var Ref = function () {
+ var Ref = function () {
- this.a = 5;
+ this.a = 5;
};
- Ref.prototype.b = function () { return this.a; };
+ Ref.prototype.b = function () {
+
+ return this.a;
+ };
expect(Hoek.deepEqual(new Obj(), new Ref())).to.be.false();
expect(Hoek.deepEqual(new Obj(), new Obj())).to.be.true();
expect(Hoek.deepEqual(new Ref(), new Ref())).to.be.true();
- done();
+ done();
});
- it('compares plain objects', function (done) {
+ it('compares plain objects', function (done) {
var a = Object.create(null);
var b = Object.create(null);
@@ -1150,122 +1198,131 @@ describe('deepEqual()', function () {
expect(Hoek.deepEqual(a, b)).to.be.true();
expect(Hoek.deepEqual(a, { b: 'c' })).to.be.false();
- done();
+ done();
});
- it('compares an object with an empty object', function (done) {
+ it('compares an object with an empty object', function (done) {
var a = { a: 1, b: 2 };
expect(Hoek.deepEqual({}, a)).to.be.false();
expect(Hoek.deepEqual(a, {})).to.be.false();
- done();
+ done();
});
- it('compares an object ignoring the prototype', function (done) {
+ it('compares an object ignoring the prototype', function (done) {
var a = Object.create(null);
var b = {};
- expect(Hoek.deepEqual(a, b, { prototype: false})).to.be.true();
- done();
+ expect(Hoek.deepEqual(a, b, { prototype: false })).to.be.true();
+ done();
});
+
+ it('compares an object ignoring the prototype recursively', function (done) {
+
+ var a = [Object.create(null)];
+ var b = [{}];
+
+ expect(Hoek.deepEqual(a, b, { prototype: false })).to.be.true();
+ done();
+ });
});
-describe('unique()', function () {
+describe('unique()', function () {
- it('ensures uniqueness within array of objects based on subkey', function (done) {
+ it('ensures uniqueness within array of objects based on subkey', function (done) {
var a = Hoek.unique(dupsArray, 'x');
expect(a).to.deep.equal(reducedDupsArray);
- done();
+ done();
});
- it('removes duplicated without key', function (done) {
+ it('removes duplicated without key', function (done) {
expect(Hoek.unique([1, 2, 3, 4, 2, 1, 5])).to.deep.equal([1, 2, 3, 4, 5]);
- done();
- });
+ done();
+ });
});
-describe('mapToObject()', function () {
+describe('mapToObject()', function () {
- it('returns null on null array', function (done) {
+ it('returns null on null array', function (done) {
var a = Hoek.mapToObject(null);
expect(a).to.equal(null);
- done();
+ done();
});
- it('converts basic array to existential object', function (done) {
+ it('converts basic array to existential object', function (done) {
var keys = [1, 2, 3, 4];
var a = Hoek.mapToObject(keys);
- for (var i in keys) {
- expect(a[keys[i]]).to.equal(true);
+ for (var i in keys) {
+ expect(a[keys[i]]).to.equal(true);
}
- done();
+ done();
});
- it('converts array of objects to existential object', function (done) {
+ it('converts array of objects to existential object', function (done) {
var keys = [{ x: 1 }, { x: 2 }, { x: 3 }, { y: 4 }];
var subkey = 'x';
var a = Hoek.mapToObject(keys, subkey);
expect(a).to.deep.equal({ 1: true, 2: true, 3: true });
- done();
- });
+ done();
+ });
});
-describe('intersect()', function () {
+describe('intersect()', function () {
- it('returns the common objects of two arrays', function (done) {
+ it('returns the common objects of two arrays', function (done) {
var array1 = [1, 2, 3, 4, 4, 5, 5];
var array2 = [5, 4, 5, 6, 7];
var common = Hoek.intersect(array1, array2);
expect(common.length).to.equal(2);
- done();
+ done();
});
- it('returns just the first common object of two arrays', function (done) {
+ it('returns just the first common object of two arrays', function (done) {
var array1 = [1, 2, 3, 4, 4, 5, 5];
var array2 = [5, 4, 5, 6, 7];
var common = Hoek.intersect(array1, array2, true);
expect(common).to.equal(5);
- done();
+ done();
});
- it('returns null when no common and returning just the first common object of two arrays', function (done) {
+ it('returns null when no common and returning just the first common object of two arrays', function (done) {
var array1 = [1, 2, 3, 4, 4, 5, 5];
var array2 = [6, 7];
var common = Hoek.intersect(array1, array2, true);
expect(common).to.equal(null);
- done();
+ done();
});
- it('returns an empty array if either input is null', function (done) {
+ it('returns an empty array if either input is null', function (done) {
expect(Hoek.intersect([1], null).length).to.equal(0);
expect(Hoek.intersect(null, [1]).length).to.equal(0);
- done();
+ done();
});
- it('returns the common objects of object and array', function (done) {
+ it('returns the common objects of object and array', function (done) {
var array1 = [1, 2, 3, 4, 4, 5, 5];
var array2 = [5, 4, 5, 6, 7];
var common = Hoek.intersect(Hoek.mapToObject(array1), array2);
expect(common.length).to.equal(2);
- done();
- });
+ done();
+ });
});
-describe('contain()', function () {
+describe('contain()', function () {
- it('tests strings', function (done) {
+ it('tests strings', function (done) {
expect(Hoek.contain('abc', 'ab')).to.be.true();
expect(Hoek.contain('abc', 'abc', { only: true })).to.be.true();
@@ -1280,10 +1337,10 @@ describe('contain()', function () {
expect(Hoek.contain('abb', 'b', { once: true })).to.be.false();
expect(Hoek.contain('abc', ['a', 'd'])).to.be.false();
expect(Hoek.contain('abc', ['ab', 'bc'])).to.be.false(); // Overlapping values not supported
- done();
+ done();
});
- it('tests arrays', function (done) {
+ it('tests arrays', function (done) {
expect(Hoek.contain([1, 2, 3], 1)).to.be.true();
expect(Hoek.contain([{ a: 1 }], { a: 1 }, { deep: true })).to.be.true();
@@ -1304,10 +1361,10 @@ describe('contain()', function () {
expect(Hoek.contain([1, 3, 2], [1, 2], { only: true })).to.be.false();
expect(Hoek.contain([1, 2, 2], [1, 2], { once: true })).to.be.false();
expect(Hoek.contain([0, 2, 3], [1, 4], { part: true })).to.be.false();
- done();
+ done();
});
- it('tests objects', function (done) {
+ it('tests objects', function (done) {
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, 'a')).to.be.true();
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'c'])).to.be.true();
@@ -1317,6 +1374,11 @@ describe('contain()', function () {
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true })).to.be.true();
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 }, { only: true })).to.be.true();
expect(Hoek.contain({ a: [1], b: [2], c: [3] }, { a: [1], c: [3] }, { deep: true })).to.be.true();
+ expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true })).to.be.true();
+ expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, part: true })).to.be.true();
+ expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, part: false })).to.be.false();
+ expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, only: true })).to.be.false();
+ expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, only: false })).to.be.true();
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, 'd')).to.be.false();
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'd'])).to.be.false();
@@ -1327,187 +1389,258 @@ describe('contain()', function () {
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 })).to.be.false();
expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 }, { only: true })).to.be.false();
expect(Hoek.contain({ a: [1], b: [2], c: [3] }, { a: [1], c: [3] })).to.be.false();
- done();
- });
+ expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } })).to.be.false();
+ expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true })).to.be.true();
+ expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, only: true })).to.be.false();
+ expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, only: false })).to.be.true();
+ expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, part: true })).to.be.true();
+ expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, part: false })).to.be.false();
+
+ // Getter check
+ var Foo = function (bar) {
+
+ this.bar = bar;
+ };
+
+ Object.defineProperty(Foo.prototype, 'baz', {
+ enumerable: true,
+ get: function () {
+
+ return this.bar;
+ }
+ });
+
+ expect(Hoek.contain({ a: new Foo('b') }, { a: new Foo('b') }, { deep: true })).to.be.true();
+ expect(Hoek.contain({ a: new Foo('b') }, { a: new Foo('b') }, { deep: true, part: true })).to.be.true();
+ expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true })).to.be.true();
+ expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true, only: true })).to.be.false();
+ expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true, part: false })).to.be.false();
+ expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true, part: true })).to.be.true();
+
+ done();
+ });
});
-describe('flatten()', function () {
+describe('flatten()', function () {
- it('returns a flat array', function (done) {
+ it('returns a flat array', function (done) {
var result = Hoek.flatten([1, 2, [3, 4, [5, 6], [7], 8], [9], [10, [11, 12]], 13]);
expect(result.length).to.equal(13);
expect(result).to.deep.equal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);
- done();
- });
+ done();
+ });
});
-describe('reach()', function () {
+describe('reach()', function () {
- var obj = {
- a: {
- b: {
- c: {
+ var obj = {
+ a: {
+ b: {
+ c: {
d: 1,
- e: 2
+ e: 2
},
- f: 'hello'
+ f: 'hello'
},
- g: {
- h: 3
- }
+ g: {
+ h: 3
+ }
},
i: function () { },
j: null,
- k: [4, 8, 9, 1]
+ k: [4, 8, 9, 1]
};
obj.i.x = 5;
- it('returns first value of array', function (done) {
+ it('returns first value of array', function (done) {
expect(Hoek.reach(obj, 'k.0')).to.equal(4);
- done();
+ done();
});
- it('returns last value of array using negative index', function (done) {
+ it('returns last value of array using negative index', function (done) {
expect(Hoek.reach(obj, 'k.-2')).to.equal(9);
- done();
+ done();
});
- it('returns a valid member', function (done) {
+ it('returns a valid member', function (done) {
expect(Hoek.reach(obj, 'a.b.c.d')).to.equal(1);
- done();
+ done();
});
- it('returns a valid member with separator override', function (done) {
+ it('returns a valid member with separator override', function (done) {
expect(Hoek.reach(obj, 'a/b/c/d', '/')).to.equal(1);
- done();
+ done();
});
- it('returns undefined on null object', function (done) {
+ it('returns undefined on null object', function (done) {
expect(Hoek.reach(null, 'a.b.c.d')).to.equal(undefined);
- done();
+ done();
});
- it('returns undefined on missing object member', function (done) {
+ it('returns undefined on missing object member', function (done) {
expect(Hoek.reach(obj, 'a.b.c.d.x')).to.equal(undefined);
- done();
+ done();
});
- it('returns undefined on missing function member', function (done) {
+ it('returns undefined on missing function member', function (done) {
expect(Hoek.reach(obj, 'i.y', { functions: true })).to.equal(undefined);
- done();
+ done();
});
- it('throws on missing member in strict mode', function (done) {
+ it('throws on missing member in strict mode', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.reach(obj, 'a.b.c.o.x', { strict: true });
+ Hoek.reach(obj, 'a.b.c.o.x', { strict: true });
}).to.throw('Missing segment o in reach path a.b.c.o.x');
- done();
+ done();
});
- it('returns undefined on invalid member', function (done) {
+ it('returns undefined on invalid member', function (done) {
expect(Hoek.reach(obj, 'a.b.c.d-.x')).to.equal(undefined);
- done();
+ done();
});
- it('returns function member', function (done) {
+ it('returns function member', function (done) {
expect(typeof Hoek.reach(obj, 'i')).to.equal('function');
- done();
+ done();
});
- it('returns function property', function (done) {
+ it('returns function property', function (done) {
expect(Hoek.reach(obj, 'i.x')).to.equal(5);
- done();
+ done();
});
- it('returns null', function (done) {
+ it('returns null', function (done) {
expect(Hoek.reach(obj, 'j')).to.equal(null);
- done();
+ done();
});
- it('throws on function property when functions not allowed', function (done) {
+ it('throws on function property when functions not allowed', function (done) {
- expect(function () {
+ expect(function () {
- Hoek.reach(obj, 'i.x', { functions: false });
+ Hoek.reach(obj, 'i.x', { functions: false });
}).to.throw('Invalid segment x in reach path i.x');
- done();
+ done();
});
- it('will return a default value if property is not found', function (done) {
+ it('will return a default value if property is not found', function (done) {
expect(Hoek.reach(obj, 'a.b.q', { default: 'defaultValue' })).to.equal('defaultValue');
- done();
+ done();
});
- it('will return a default value if path is not found', function (done) {
+ it('will return a default value if path is not found', function (done) {
expect(Hoek.reach(obj, 'q', { default: 'defaultValue' })).to.equal('defaultValue');
- done();
+ done();
});
- it('allows a falsey value to be used as the default value', function (done) {
+ it('allows a falsey value to be used as the default value', function (done) {
expect(Hoek.reach(obj, 'q', { default: '' })).to.equal('');
- done();
- });
+ done();
+ });
+});
+
+describe('reachTemplate()', function () {
+
+ it('applies object to template', function (done) {
+
+ var obj = {
+ a: {
+ b: {
+ c: {
+ d: 1
+ }
+ }
+ },
+ j: null,
+ k: [4, 8, 9, 1]
+ };
+
+ var template = '{k.0}:{k.-2}:{a.b.c.d}:{x.y}:{j}';
+
+ expect(Hoek.reachTemplate(obj, template)).to.equal('4:9:1::');
+ done();
+ });
+
+ it('applies object to template (options)', function (done) {
+
+ var obj = {
+ a: {
+ b: {
+ c: {
+ d: 1
+ }
+ }
+ },
+ j: null,
+ k: [4, 8, 9, 1]
+ };
+
+ var template = '{k/0}:{k/-2}:{a/b/c/d}:{x/y}:{j}';
+
+ expect(Hoek.reachTemplate(obj, template, '/')).to.equal('4:9:1::');
+ done();
+ });
});
-describe('callStack()', function () {
+describe('callStack()', function () {
- it('returns the full call stack', function (done) {
+ it('returns the full call stack', function (done) {
var stack = Hoek.callStack();
expect(stack[0][0]).to.contain('index.js');
expect(stack[0][2]).to.equal(26);
- done();
- });
+ done();
+ });
});
-describe('displayStack ()', function () {
+describe('displayStack ()', function () {
- it('returns the full call stack for display', function (done) {
+ it('returns the full call stack for display', function (done) {
var stack = Hoek.displayStack();
expect(stack[0]).to.contain(Path.normalize('/test/index.js') + ':');
- done();
+ done();
});
- it('includes constructor functions correctly', function (done) {
+ it('includes constructor functions correctly', function (done) {
- var Something = function (next) {
+ var Something = function (next) {
- next();
+ next();
};
- var something = new Something(function () {
+ var something = new Something(function () {
var stack = Hoek.displayStack();
expect(stack[1]).to.contain('new Something');
- done();
- });
- });
+ done();
+ });
+ });
});
-describe('abort()', function () {
+describe('abort()', function () {
- it('exits process when not in test mode', function (done) {
+ it('exits process when not in test mode', function (done) {
var env = process.env.NODE_ENV;
var write = process.stdout.write;
@@ -1515,38 +1648,38 @@ describe('abort()', function () {
process.env.NODE_ENV = 'nottatest';
process.stdout.write = function () { };
- process.exit = function (state) {
+ process.exit = function (state) {
process.exit = exit;
process.env.NODE_ENV = env;
process.stdout.write = write;
expect(state).to.equal(1);
- done();
+ done();
};
- Hoek.abort('Boom');
+ Hoek.abort('Boom');
});
- it('throws when not in test mode and abortThrow is true', function (done) {
+ it('throws when not in test mode and abortThrow is true', function (done) {
var env = process.env.NODE_ENV;
process.env.NODE_ENV = 'nottatest';
Hoek.abortThrow = true;
- var fn = function () {
+ var fn = function () {
- Hoek.abort('my error message');
+ Hoek.abort('my error message');
};
expect(fn).to.throw('my error message');
Hoek.abortThrow = false;
process.env.NODE_ENV = env;
- done();
+ done();
});
- it('respects hideStack argument', function (done) {
+ it('respects hideStack argument', function (done) {
var env = process.env.NODE_ENV;
var write = process.stdout.write;
@@ -1555,9 +1688,9 @@ describe('abort()', function () {
process.exit = function () { };
process.env.NODE_ENV = '';
- process.stdout.write = function (message) {
+ process.stdout.write = function (message) {
- output = message;
+ output = message;
};
Hoek.abort('my error message', true);
@@ -1568,38 +1701,38 @@ describe('abort()', function () {
expect(output).to.equal('ABORT: my error message\n\t\n');
- done();
+ done();
});
- it('throws in test mode', function (done) {
+ it('throws in test mode', function (done) {
var env = process.env.NODE_ENV;
process.env.NODE_ENV = 'test';
- expect(function () {
+ expect(function () {
- Hoek.abort('my error message', true);
+ Hoek.abort('my error message', true);
}).to.throw('my error message');
process.env.NODE_ENV = env;
- done();
+ done();
});
- it('throws in test mode with default message', function (done) {
+ it('throws in test mode with default message', function (done) {
var env = process.env.NODE_ENV;
process.env.NODE_ENV = 'test';
- expect(function () {
+ expect(function () {
- Hoek.abort('', true);
+ Hoek.abort('', true);
}).to.throw('Unknown error');
process.env.NODE_ENV = env;
- done();
+ done();
});
- it('defaults to showing stack', function (done) {
+ it('defaults to showing stack', function (done) {
var env = process.env.NODE_ENV;
var write = process.stdout.write;
@@ -1608,9 +1741,9 @@ describe('abort()', function () {
process.exit = function () { };
process.env.NODE_ENV = '';
- process.stdout.write = function (message) {
+ process.stdout.write = function (message) {
- output = message;
+ output = message;
};
Hoek.abort('my error message');
@@ -1621,172 +1754,173 @@ describe('abort()', function () {
expect(output).to.contain('index.js');
- done();
- });
+ done();
+ });
});
-describe('assert()', function () {
+describe('assert()', function () {
- it('throws an Error when using assert in a test', function (done) {
+ it('throws an Error when using assert in a test', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false, 'my error message');
+ Hoek.assert(false, 'my error message');
};
expect(fn).to.throw('my error message');
- done();
+ done();
});
- it('throws an Error when using assert in a test with no message', function (done) {
+ it('throws an Error when using assert in a test with no message', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false);
+ Hoek.assert(false);
};
expect(fn).to.throw('Unknown error');
- done();
+ done();
});
- it('throws an Error when using assert in a test with multipart message', function (done) {
+ it('throws an Error when using assert in a test with multipart message', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false, 'This', 'is', 'my message');
+ Hoek.assert(false, 'This', 'is', 'my message');
};
expect(fn).to.throw('This is my message');
- done();
+ done();
});
- it('throws an Error when using assert in a test with multipart message (empty)', function (done) {
+ it('throws an Error when using assert in a test with multipart message (empty)', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false, 'This', 'is', '', 'my message');
+ Hoek.assert(false, 'This', 'is', '', 'my message');
};
expect(fn).to.throw('This is my message');
- done();
+ done();
});
- it('throws an Error when using assert in a test with object message', function (done) {
+ it('throws an Error when using assert in a test with object message', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false, 'This', 'is', { spinal: 'tap' });
+ Hoek.assert(false, 'This', 'is', { spinal: 'tap' });
};
expect(fn).to.throw('This is {"spinal":"tap"}');
- done();
+ done();
});
- it('throws an Error when using assert in a test with multipart string and error messages', function (done) {
+ it('throws an Error when using assert in a test with multipart string and error messages', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false, 'This', 'is', new Error('spinal'), new Error('tap'));
+ Hoek.assert(false, 'This', 'is', new Error('spinal'), new Error('tap'));
};
expect(fn).to.throw('This is spinal tap');
- done();
+ done();
});
- it('throws an Error when using assert in a test with error object message', function (done) {
+ it('throws an Error when using assert in a test with error object message', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false, new Error('This is spinal tap'));
+ Hoek.assert(false, new Error('This is spinal tap'));
};
expect(fn).to.throw('This is spinal tap');
- done();
+ done();
});
- it('throws the same Error that is passed to it if there is only one error passed', function (done) {
+ it('throws the same Error that is passed to it if there is only one error passed', function (done) {
+
var error = new Error('ruh roh');
var error2 = new Error('ruh roh');
- var fn = function () {
+ var fn = function () {
- Hoek.assert(false, error);
+ Hoek.assert(false, error);
};
- try {
- fn();
- } catch (err) {
+ try {
+ fn();
+ } catch (err) {
expect(error).to.equal(error); // should be the same reference
expect(error).to.not.equal(error2); // error with the same message should not match
}
- done();
- });
+ done();
+ });
});
-describe('Timer', function () {
+describe('Timer', function () {
- it('returns time elapsed', function (done) {
+ it('returns time elapsed', function (done) {
var timer = new Hoek.Timer();
- setTimeout(function () {
+ setTimeout(function () {
expect(timer.elapsed()).to.be.above(9);
- done();
- }, 12);
- });
+ done();
+ }, 12);
+ });
});
-describe('Bench', function () {
+describe('Bench', function () {
- it('returns time elapsed', function (done) {
+ it('returns time elapsed', function (done) {
var timer = new Hoek.Bench();
- setTimeout(function () {
+ setTimeout(function () {
expect(timer.elapsed()).to.be.above(9);
- done();
- }, 12);
- });
+ done();
+ }, 12);
+ });
});
-describe('escapeRegex()', function () {
+describe('escapeRegex()', function () {
- it('escapes all special regular expression characters', function (done) {
+ it('escapes all special regular expression characters', function (done) {
var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,');
expect(a).to.equal('4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`"\\(>\\)\\[<\\]d\\{\\}s\\,');
- done();
- });
+ done();
+ });
});
-describe('Base64Url', function () {
+describe('Base64Url', function () {
var base64str = 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0-P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn-AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq-wsbKztLW2t7i5uru8vb6_wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy8_T19vf4-fr7_P3-_w';
var str = unescape('%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF');
- describe('base64urlEncode()', function () {
+ describe('base64urlEncode()', function () {
- it('should base64 URL-safe a string', function (done) {
+ it('should base64 URL-safe a string', function (done) {
expect(Hoek.base64urlEncode(str)).to.equal(base64str);
- done();
+ done();
});
- it('encodes a buffer', function (done) {
+ it('encodes a buffer', function (done) {
expect(Hoek.base64urlEncode(new Buffer(str, 'binary'))).to.equal(base64str);
- done();
+ done();
});
- it('should base64 URL-safe a hex string', function (done) {
+ it('should base64 URL-safe a hex string', function (done) {
var buffer = new Buffer(str, 'binary');
expect(Hoek.base64urlEncode(buffer.toString('hex'), 'hex')).to.equal(base64str);
- done();
+ done();
});
- it('works on larger input strings', function (done) {
+ it('works on larger input strings', function (done) {
var input = Fs.readFileSync(Path.join(__dirname, 'index.js')).toString();
var encoded = Hoek.base64urlEncode(input);
@@ -1797,145 +1931,145 @@ describe('Base64Url', function () {
var decoded = Hoek.base64urlDecode(encoded);
expect(decoded).to.equal(input);
- done();
- });
+ done();
+ });
});
- describe('base64urlDecode()', function () {
+ describe('base64urlDecode()', function () {
- it('should un-base64 URL-safe a string', function (done) {
+ it('should un-base64 URL-safe a string', function (done) {
expect(Hoek.base64urlDecode(base64str)).to.equal(str);
- done();
+ done();
});
- it('should un-base64 URL-safe a string into hex', function (done) {
+ it('should un-base64 URL-safe a string into hex', function (done) {
expect(Hoek.base64urlDecode(base64str, 'hex')).to.equal(new Buffer(str, 'binary').toString('hex'));
- done();
+ done();
});
- it('should un-base64 URL-safe a string and return a buffer', function (done) {
+ it('should un-base64 URL-safe a string and return a buffer', function (done) {
var buf = Hoek.base64urlDecode(base64str, 'buffer');
expect(buf instanceof Buffer).to.equal(true);
expect(buf.toString('binary')).to.equal(str);
- done();
+ done();
});
- it('returns error on undefined input', function (done) {
+ it('returns error on undefined input', function (done) {
expect(Hoek.base64urlDecode().message).to.exist();
- done();
+ done();
});
- it('returns error on invalid input', function (done) {
+ it('returns error on invalid input', function (done) {
expect(Hoek.base64urlDecode('*').message).to.exist();
- done();
- });
- });
+ done();
+ });
+ });
});
-describe('escapeHeaderAttribute()', function () {
+describe('escapeHeaderAttribute()', function () {
- it('should not alter ascii values', function (done) {
+ it('should not alter ascii values', function (done) {
var a = Hoek.escapeHeaderAttribute('My Value');
expect(a).to.equal('My Value');
- done();
+ done();
});
- it('escapes all special HTTP header attribute characters', function (done) {
+ it('escapes all special HTTP header attribute characters', function (done) {
var a = Hoek.escapeHeaderAttribute('I said go!!!#"' + String.fromCharCode(92));
expect(a).to.equal('I said go!!!#\\"\\\\');
- done();
+ done();
});
- it('throws on large unicode characters', function (done) {
+ it('throws on large unicode characters', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.escapeHeaderAttribute('this is a test' + String.fromCharCode(500) + String.fromCharCode(300));
+ Hoek.escapeHeaderAttribute('this is a test' + String.fromCharCode(500) + String.fromCharCode(300));
};
expect(fn).to.throw(Error);
- done();
+ done();
});
- it('throws on CRLF to prevent response splitting', function (done) {
+ it('throws on CRLF to prevent response splitting', function (done) {
- var fn = function () {
+ var fn = function () {
- Hoek.escapeHeaderAttribute('this is a test\r\n');
+ Hoek.escapeHeaderAttribute('this is a test\r\n');
};
expect(fn).to.throw(Error);
- done();
- });
+ done();
+ });
});
-describe('escapeHtml()', function () {
+describe('escapeHtml()', function () {
- it('escapes all special HTML characters', function (done) {
+ it('escapes all special HTML characters', function (done) {
var a = Hoek.escapeHtml('&<>"\'`');
expect(a).to.equal('&amp;&lt;&gt;&quot;&#x27;&#x60;');
- done();
+ done();
});
- it('returns empty string on falsy input', function (done) {
+ it('returns empty string on falsy input', function (done) {
var a = Hoek.escapeHtml('');
expect(a).to.equal('');
- done();
+ done();
});
- it('returns unchanged string on no reserved input', function (done) {
+ it('returns unchanged string on no reserved input', function (done) {
var a = Hoek.escapeHtml('abc');
expect(a).to.equal('abc');
- done();
- });
+ done();
+ });
});
-describe('nextTick()', function () {
+describe('nextTick()', function () {
- it('calls the provided callback on nextTick', function (done) {
+ it('calls the provided callback on nextTick', function (done) {
var a = 0;
- var inc = function (step, next) {
+ var inc = function (step, next) {
a += step;
- next();
+ next();
};
var ticked = Hoek.nextTick(inc);
- ticked(5, function () {
+ ticked(5, function () {
expect(a).to.equal(6);
- done();
+ done();
});
expect(a).to.equal(0);
- inc(1, function () {
+ inc(1, function () {
- expect(a).to.equal(1);
- });
- });
+ expect(a).to.equal(1);
+ });
+ });
});
-describe('once()', function () {
+describe('once()', function () {
- it('allows function to only execute once', function (done) {
+ it('allows function to only execute once', function (done) {
var gen = 0;
- var add = function (x) {
+ var add = function (x) {
- gen += x;
+ gen += x;
};
add(5);
@@ -1945,23 +2079,23 @@ describe('once()', function () {
expect(gen).to.equal(10);
add(5);
expect(gen).to.equal(10);
- done();
+ done();
});
- it('double once wraps one time', function (done) {
+ it('double once wraps one time', function (done) {
var method = function () { };
method = Hoek.once(method);
method.x = 1;
method = Hoek.once(method);
expect(method.x).to.equal(1);
- done();
- });
+ done();
+ });
});
-describe('isAbsoltePath()', function () {
+describe('isAbsoltePath()', function () {
- it('identifies if path is absolute on Unix without node support', { parallel: false }, function (done) {
+ it('identifies if path is absolute on Unix without node support', { parallel: false }, function (done) {
var orig = Path.isAbsolute;
Path.isAbsolute = undefined;
@@ -1974,13 +2108,16 @@ describe('isAbsoltePath()', function () {
Path.isAbsolute = orig;
- done();
+ done();
});
- it('identifies if path is absolute with fake node support', { parallel: false }, function (done) {
+ it('identifies if path is absolute with fake node support', { parallel: false }, function (done) {
var orig = Path.isAbsolute;
- Path.isAbsolute = function (path) { return path[0] === '/'; };
+ Path.isAbsolute = function (path) {
+
+ return path[0] === '/';
+ };
expect(Hoek.isAbsolutePath('', 'linux')).to.equal(false);
expect(Hoek.isAbsolutePath('a', 'linux')).to.equal(false);
@@ -1990,10 +2127,10 @@ describe('isAbsoltePath()', function () {
Path.isAbsolute = orig;
- done();
+ done();
});
- it('identifies if path is absolute on Windows without node support', { parallel: false }, function (done) {
+ it('identifies if path is absolute on Windows without node support', { parallel: false }, function (done) {
var orig = Path.isAbsolute;
Path.isAbsolute = undefined;
@@ -2010,13 +2147,13 @@ describe('isAbsoltePath()', function () {
Path.isAbsolute = orig;
- done();
- });
+ done();
+ });
});
-describe('isInteger()', function () {
+describe('isInteger()', function () {
- it('validates integers', function (done) {
+ it('validates integers', function (done) {
expect(Hoek.isInteger(0)).to.equal(true);
expect(Hoek.isInteger(1)).to.equal(true);
@@ -2024,264 +2161,265 @@ describe('isInteger()', function () {
expect(Hoek.isInteger('0')).to.equal(false);
expect(Hoek.isInteger(1.0)).to.equal(true);
expect(Hoek.isInteger(1.1)).to.equal(false);
- done();
- });
+ done();
+ });
});
-describe('ignore()', function () {
+describe('ignore()', function () {
- it('exists', function (done) {
+ it('exists', function (done) {
expect(Hoek.ignore).to.exist();
expect(typeof Hoek.ignore).to.equal('function');
- done();
- });
+ done();
+ });
});
-describe('inherits()', function () {
+describe('inherits()', function () {
- it('exists', function (done) {
+ it('exists', function (done) {
expect(Hoek.inherits).to.exist();
expect(typeof Hoek.inherits).to.equal('function');
- done();
- });
+ done();
+ });
});
-describe('format()', function () {
+describe('format()', function () {
- it('exists', function (done) {
+ it('exists', function (done) {
expect(Hoek.format).to.exist();
expect(typeof Hoek.format).to.equal('function');
- done();
+ done();
});
- it('is a reference to Util.format', function (done) {
+ it('is a reference to Util.format', function (done) {
expect(Hoek.format('hello %s', 'world')).to.equal('hello world');
- done();
- });
+ done();
+ });
});
-describe('transform()', function () {
+describe('transform()', function () {
- var source = {
- address: {
+ var source = {
+ address: {
one: '123 main street',
- two: 'PO Box 1234'
+ two: 'PO Box 1234'
},
- zip: {
+ zip: {
code: 3321232,
- province: null
+ province: null
},
title: 'Warehouse',
- state: 'CA'
+ state: 'CA'
};
- it('transforms an object based on the input object', function (done) {
+ it('transforms an object based on the input object', function (done) {
- var result = Hoek.transform(source, {
+ var result = Hoek.transform(source, {
'person.address.lineOne': 'address.one',
'person.address.lineTwo': 'address.two',
'title': 'title',
'person.address.region': 'state',
'person.address.zip': 'zip.code',
- 'person.address.location': 'zip.province'
+ 'person.address.location': 'zip.province'
});
- expect(result).to.deep.equal({
- person: {
- address: {
+ expect(result).to.deep.equal({
+ person: {
+ address: {
lineOne: '123 main street',
lineTwo: 'PO Box 1234',
region: 'CA',
zip: 3321232,
- location: null
- }
+ location: null
+ }
},
- title: 'Warehouse'
+ title: 'Warehouse'
});
- done();
+ done();
});
- it('uses the reach options passed into it', function (done) {
+ it('uses the reach options passed into it', function (done) {
- var schema = {
+ var schema = {
'person.address.lineOne': 'address-one',
'person.address.lineTwo': 'address-two',
'title': 'title',
'person.address.region': 'state',
'person.prefix': 'person-title',
- 'person.zip': 'zip-code'
+ 'person.zip': 'zip-code'
};
- var options = {
+ var options = {
separator: '-',
- default: 'unknown'
+ default: 'unknown'
};
var result = Hoek.transform(source, schema, options);
- expect(result).to.deep.equal({
- person: {
- address: {
+ expect(result).to.deep.equal({
+ person: {
+ address: {
lineOne: '123 main street',
lineTwo: 'PO Box 1234',
- region: 'CA'
+ region: 'CA'
},
prefix: 'unknown',
- zip: 3321232
+ zip: 3321232
},
- title: 'Warehouse'
+ title: 'Warehouse'
});
- done();
+ done();
});
- it('works to create shallow objects', function (done) {
+ it('works to create shallow objects', function (done) {
- var result = Hoek.transform(source, {
+ var result = Hoek.transform(source, {
lineOne: 'address.one',
lineTwo: 'address.two',
title: 'title',
region: 'state',
- province: 'zip.province'
+ province: 'zip.province'
});
- expect(result).to.deep.equal({
+ expect(result).to.deep.equal({
lineOne: '123 main street',
lineTwo: 'PO Box 1234',
title: 'Warehouse',
region: 'CA',
- province: null
+ province: null
});
- done();
+ done();
});
- it('only allows strings in the map', function (done) {
+ it('only allows strings in the map', function (done) {
expect(function () {
+
var result = Hoek.transform(source, {
lineOne: {}
});
}).to.throw('All mappings must be "." delineated strings');
- done();
+ done();
});
- it('throws an error on invalid arguments', function (done) {
+ it('throws an error on invalid arguments', function (done) {
- expect(function () {
+ expect(function () {
- var result = Hoek.transform(NaN, {});
+ var result = Hoek.transform(NaN, {});
}).to.throw('Invalid source object: must be null, undefined, or an object');
- done();
+ done();
});
- it('is safe to pass null', function (done) {
+ it('is safe to pass null', function (done) {
var result = Hoek.transform(null, {});
expect(result).to.deep.equal({});
- done();
+ done();
});
- it('is safe to pass undefined', function (done) {
+ it('is safe to pass undefined', function (done) {
var result = Hoek.transform(undefined, {});
expect(result).to.deep.equal({});
- done();
- });
+ done();
+ });
});
-describe('uniqueFilename()', function () {
+describe('uniqueFilename()', function () {
- it('generates a random file path', function (done) {
+ it('generates a random file path', function (done) {
var result = Hoek.uniqueFilename('./test/modules');
expect(result).to.exist();
expect(result).to.be.a.string();
expect(result).to.contain('test/modules');
- done();
+ done();
});
- it('is random enough to use in fast loops', function (done) {
+ it('is random enough to use in fast loops', function (done) {
var results = [];
- for (var i = 0; i < 10; ++i) {
- results[i] = Hoek.uniqueFilename('./test/modules');
+ for (var i = 0; i < 10; ++i) {
+ results[i] = Hoek.uniqueFilename('./test/modules');
}
- var filter = results.filter(function (item, index, array) {
+ var filter = results.filter(function (item, index, array) {
- return array.indexOf(item) === index;
+ return array.indexOf(item) === index;
});
expect(filter.length).to.equal(10);
expect(results.length).to.equal(10);
- done();
+ done();
});
- it('combines the random elements with a supplied character', function (done) {
+ it('combines the random elements with a supplied character', function (done) {
var result = Hoek.uniqueFilename('./test', 'txt');
expect(result).to.contain('test/');
expect(result).to.contain('.txt');
- done();
+ done();
});
- it('accepts extensions with a "." in it', function (done) {
+ it('accepts extensions with a "." in it', function (done) {
var result = Hoek.uniqueFilename('./test', '.mp3');
expect(result).to.contain('test/');
expect(result).to.contain('.mp3');
- done();
- });
+ done();
+ });
});
-describe('stringify()', function (done) {
+describe('stringify()', function (done) {
- it('converts object to string', function (done) {
+ it('converts object to string', function (done) {
var obj = { a: 1 };
expect(Hoek.stringify(obj)).to.equal('{"a":1}');
- done();
+ done();
});
- it('returns error in result string', function (done) {
+ it('returns error in result string', function (done) {
var obj = { a: 1 };
obj.b = obj;
expect(Hoek.stringify(obj)).to.equal('[Cannot display object: Converting circular structure to JSON]');
- done();
- });
+ done();
+ });
});
-describe('shallow()', function (done) {
+describe('shallow()', function (done) {
- it('shallow copies an object', function (done) {
+ it('shallow copies an object', function (done) {
- var obj = {
+ var obj = {
a: 5,
- b: {
- c: 6
- }
+ b: {
+ c: 6
+ }
};
var shallow = Hoek.shallow(obj);
expect(shallow).to.not.equal(obj);
expect(shallow).to.deep.equal(obj);
expect(shallow.b).to.equal(obj.b);
- done();
- });
+ done();
+ });
});
diff --git a/node_modules/request/node_modules/hawk/node_modules/sntp/package.json b/node_modules/request/node_modules/hawk/node_modules/sntp/package.json
index 6fe68c1b2..9ae1b926e 100644
--- a/node_modules/request/node_modules/hawk/node_modules/sntp/package.json
+++ b/node_modules/request/node_modules/hawk/node_modules/sntp/package.json
@@ -10,7 +10,7 @@
"contributors": [],
"repository": {
"type": "git",
- "url": "git://github.com/hueniverse/sntp"
+ "url": "git://github.com/hueniverse/sntp.git"
},
"main": "index",
"keywords": [
@@ -36,29 +36,14 @@
"url": "http://github.com/hueniverse/sntp/raw/master/LICENSE"
}
],
- "gitHead": "ee2e35284f684609990681734d39010cd356d7da",
+ "readme": "# sntp\n\nAn SNTP v4 client (RFC4330) for node. Simpy connects to the NTP or SNTP server requested and returns the server time\nalong with the roundtrip duration and clock offset. To adjust the local time to the NTP time, add the returned `t` offset\nto the local time.\n\n[![Build Status](https://secure.travis-ci.org/hueniverse/sntp.png)](http://travis-ci.org/hueniverse/sntp)\n\n# Usage\n\n```javascript\nvar Sntp = require('sntp');\n\n// All options are optional\n\nvar options = {\n host: 'nist1-sj.ustiming.org', // Defaults to pool.ntp.org\n port: 123, // Defaults to 123 (NTP)\n resolveReference: true, // Default to false (not resolving)\n timeout: 1000 // Defaults to zero (no timeout)\n};\n\n// Request server time\n\nSntp.time(options, function (err, time) {\n\n if (err) {\n console.log('Failed: ' + err.message);\n process.exit(1);\n }\n\n console.log('Local clock is off by: ' + time.t + ' milliseconds');\n process.exit(0);\n});\n```\n\nIf an application needs to maintain continuous time synchronization, the module provides a stateful method for\nquerying the current offset only when the last one is too old (defaults to daily).\n\n```javascript\n// Request offset once\n\nSntp.offset(function (err, offset) {\n\n console.log(offset); // New (served fresh)\n\n // Request offset again\n\n Sntp.offset(function (err, offset) {\n\n console.log(offset); // Identical (served from cache)\n });\n});\n```\n\nTo set a background offset refresh, start the interval and use the provided now() method. If for any reason the\nclient fails to obtain an up-to-date offset, the current system clock is used.\n\n```javascript\nvar before = Sntp.now(); // System time without offset\n\nSntp.start(function () {\n\n var now = Sntp.now(); // With offset\n Sntp.stop();\n});\n```\n\n",
+ "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/hueniverse/sntp/issues"
},
- "homepage": "https://github.com/hueniverse/sntp",
+ "homepage": "https://github.com/hueniverse/sntp#readme",
"_id": "sntp@1.0.9",
"_shasum": "6541184cc90aeea6c6e7b35e2659082443c66198",
- "_from": "sntp@>=1.0.0 <2.0.0",
- "_npmVersion": "1.4.23",
- "_npmUser": {
- "name": "hueniverse",
- "email": "eran@hueniverse.com"
- },
- "maintainers": [
- {
- "name": "hueniverse",
- "email": "eran@hueniverse.com"
- }
- ],
- "dist": {
- "shasum": "6541184cc90aeea6c6e7b35e2659082443c66198",
- "tarball": "http://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
+ "_resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "_from": "sntp@>=1.0.0 <2.0.0"
}
diff --git a/node_modules/request/node_modules/hawk/package.json b/node_modules/request/node_modules/hawk/package.json
index 3986e1172..b7077b398 100644
--- a/node_modules/request/node_modules/hawk/package.json
+++ b/node_modules/request/node_modules/hawk/package.json
@@ -10,7 +10,7 @@
"contributors": [],
"repository": {
"type": "git",
- "url": "git://github.com/hueniverse/hawk"
+ "url": "git://github.com/hueniverse/hawk.git"
},
"main": "index",
"keywords": [
@@ -42,29 +42,14 @@
"url": "http://github.com/hueniverse/hawk/raw/master/LICENSE"
}
],
- "gitHead": "492632da51ecedd5f59ce96f081860ad24ce6532",
+ "readme": "![hawk Logo](https://raw.github.com/hueniverse/hawk/master/images/hawk.png)\n\n<img align=\"right\" src=\"https://raw.github.com/hueniverse/hawk/master/images/logo.png\" /> **Hawk** is an HTTP authentication scheme using a message authentication code (MAC) algorithm to provide partial\nHTTP request cryptographic verification. For more complex use cases such as access delegation, see [Oz](https://github.com/hueniverse/oz).\n\nCurrent version: **2.3**\n\nNote: 2.x is the same exact protocol as 1.1. The version increment reflects a change in the internal error format\nused by the module and used by the node API.\n\n[![Build Status](https://secure.travis-ci.org/hueniverse/hawk.png)](http://travis-ci.org/hueniverse/hawk)\n\n# Table of Content\n\n- [**Introduction**](#introduction)\n - [Replay Protection](#replay-protection)\n - [Usage Example](#usage-example)\n - [Protocol Example](#protocol-example)\n - [Payload Validation](#payload-validation)\n - [Response Payload Validation](#response-payload-validation)\n - [Browser Support and Considerations](#browser-support-and-considerations)\n<p></p>\n- [**Single URI Authorization**](#single-uri-authorization)\n - [Usage Example](#bewit-usage-example)\n<p></p>\n- [**Security Considerations**](#security-considerations)\n - [MAC Keys Transmission](#mac-keys-transmission)\n - [Confidentiality of Requests](#confidentiality-of-requests)\n - [Spoofing by Counterfeit Servers](#spoofing-by-counterfeit-servers)\n - [Plaintext Storage of Credentials](#plaintext-storage-of-credentials)\n - [Entropy of Keys](#entropy-of-keys)\n - [Coverage Limitations](#coverage-limitations)\n - [Future Time Manipulation](#future-time-manipulation)\n - [Client Clock Poisoning](#client-clock-poisoning)\n - [Bewit Limitations](#bewit-limitations)\n - [Host Header Forgery](#host-header-forgery)\n<p></p>\n- [**Frequently Asked Questions**](#frequently-asked-questions)\n<p></p>\n- [**Implementations**](#implementations)\n- [**Acknowledgements**](#acknowledgements)\n\n# Introduction\n\n**Hawk** is an HTTP authentication scheme providing mechanisms for making authenticated HTTP requests with\npartial cryptographic verification of the request and response, covering the HTTP method, request URI, host,\nand optionally the request payload.\n\nSimilar to the HTTP [Digest access authentication schemes](http://www.ietf.org/rfc/rfc2617.txt), **Hawk** uses a set of\nclient credentials which include an identifier (e.g. username) and key (e.g. password). Likewise, just as with the Digest scheme,\nthe key is never included in authenticated requests. Instead, it is used to calculate a request MAC value which is\nincluded in its place.\n\nHowever, **Hawk** has several differences from Digest. In particular, while both use a nonce to limit the possibility of\nreplay attacks, in **Hawk** the client generates the nonce and uses it in combination with a timestamp, leading to less\n\"chattiness\" (interaction with the server).\n\nAlso unlike Digest, this scheme is not intended to protect the key itself (the password in Digest) because\nthe client and server must both have access to the key material in the clear.\n\nThe primary design goals of this scheme are to:\n* simplify and improve HTTP authentication for services that are unwilling or unable to deploy TLS for all resources,\n* secure credentials against leakage (e.g., when the client uses some form of dynamic configuration to determine where\n to send an authenticated request), and\n* avoid the exposure of credentials sent to a malicious server over an unauthenticated secure channel due to client\n failure to validate the server's identity as part of its TLS handshake.\n\nIn addition, **Hawk** supports a method for granting third-parties temporary access to individual resources using\na query parameter called _bewit_ (in falconry, a leather strap used to attach a tracking device to the leg of a hawk).\n\nThe **Hawk** scheme requires the establishment of a shared symmetric key between the client and the server,\nwhich is beyond the scope of this module. Typically, the shared credentials are established via an initial\nTLS-protected phase or derived from some other shared confidential information available to both the client\nand the server.\n\n\n## Replay Protection\n\nWithout replay protection, an attacker can use a compromised (but otherwise valid and authenticated) request more \nthan once, gaining access to a protected resource. To mitigate this, clients include both a nonce and a timestamp when \nmaking requests. This gives the server enough information to prevent replay attacks.\n\nThe nonce is generated by the client, and is a string unique across all requests with the same timestamp and\nkey identifier combination. \n\nThe timestamp enables the server to restrict the validity period of the credentials where requests occuring afterwards\nare rejected. It also removes the need for the server to retain an unbounded number of nonce values for future checks.\nBy default, **Hawk** uses a time window of 1 minute to allow for time skew between the client and server (which in\npractice translates to a maximum of 2 minutes as the skew can be positive or negative).\n\nUsing a timestamp requires the client's clock to be in sync with the server's clock. **Hawk** requires both the client\nclock and the server clock to use NTP to ensure synchronization. However, given the limitations of some client types\n(e.g. browsers) to deploy NTP, the server provides the client with its current time (in seconds precision) in response\nto a bad timestamp.\n\nThere is no expectation that the client will adjust its system clock to match the server (in fact, this would be a\npotential attack vector). Instead, the client only uses the server's time to calculate an offset used only\nfor communications with that particular server. The protocol rewards clients with synchronized clocks by reducing\nthe number of round trips required to authenticate the first request.\n\n\n## Usage Example\n\nServer code:\n\n```javascript\nvar Http = require('http');\nvar Hawk = require('hawk');\n\n\n// Credentials lookup function\n\nvar credentialsFunc = function (id, callback) {\n\n var credentials = {\n key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\n algorithm: 'sha256',\n user: 'Steve'\n };\n\n return callback(null, credentials);\n};\n\n// Create HTTP server\n\nvar handler = function (req, res) {\n\n // Authenticate incoming request\n\n Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {\n\n // Prepare response\n\n var payload = (!err ? 'Hello ' + credentials.user + ' ' + artifacts.ext : 'Shoosh!');\n var headers = { 'Content-Type': 'text/plain' };\n\n // Generate Server-Authorization response header\n\n var header = Hawk.server.header(credentials, artifacts, { payload: payload, contentType: headers['Content-Type'] });\n headers['Server-Authorization'] = header;\n\n // Send the response back\n\n res.writeHead(!err ? 200 : 401, headers);\n res.end(payload);\n });\n};\n\n// Start server\n\nHttp.createServer(handler).listen(8000, 'example.com');\n```\n\nClient code:\n\n```javascript\nvar Request = require('request');\nvar Hawk = require('hawk');\n\n\n// Client credentials\n\nvar credentials = {\n id: 'dh37fgj492je',\n key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\n algorithm: 'sha256'\n}\n\n// Request options\n\nvar requestOptions = {\n uri: 'http://example.com:8000/resource/1?b=1&a=2',\n method: 'GET',\n headers: {}\n};\n\n// Generate Authorization request header\n\nvar header = Hawk.client.header('http://example.com:8000/resource/1?b=1&a=2', 'GET', { credentials: credentials, ext: 'some-app-data' });\nrequestOptions.headers.Authorization = header.field;\n\n// Send authenticated request\n\nRequest(requestOptions, function (error, response, body) {\n\n // Authenticate the server's response\n\n var isValid = Hawk.client.authenticate(response, credentials, header.artifacts, { payload: body });\n\n // Output results\n\n console.log(response.statusCode + ': ' + body + (isValid ? ' (valid)' : ' (invalid)'));\n});\n```\n\n**Hawk** utilized the [**SNTP**](https://github.com/hueniverse/sntp) module for time sync management. By default, the local\nmachine time is used. To automatically retrieve and synchronice the clock within the application, use the SNTP 'start()' method.\n\n```javascript\nHawk.sntp.start();\n```\n\n\n## Protocol Example\n\nThe client attempts to access a protected resource without authentication, sending the following HTTP request to\nthe resource server:\n\n```\nGET /resource/1?b=1&a=2 HTTP/1.1\nHost: example.com:8000\n```\n\nThe resource server returns an authentication challenge.\n\n```\nHTTP/1.1 401 Unauthorized\nWWW-Authenticate: Hawk\n```\n\nThe client has previously obtained a set of **Hawk** credentials for accessing resources on the \"http://example.com/\"\nserver. The **Hawk** credentials issued to the client include the following attributes:\n\n* Key identifier: dh37fgj492je\n* Key: werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn\n* Algorithm: sha256\n\nThe client generates the authentication header by calculating a timestamp (e.g. the number of seconds since January 1,\n1970 00:00:00 GMT), generating a nonce, and constructing the normalized request string (each value followed by a newline\ncharacter):\n\n```\nhawk.1.header\n1353832234\nj4h3g2\nGET\n/resource/1?b=1&a=2\nexample.com\n8000\n\nsome-app-ext-data\n\n```\n\nThe request MAC is calculated using HMAC with the specified hash algorithm \"sha256\" and the key over the normalized request string.\nThe result is base64-encoded to produce the request MAC:\n\n```\n6R4rV5iE+NPoym+WwjeHzjAGXUtLNIxmo1vpMofpLAE=\n```\n\nThe client includes the **Hawk** key identifier, timestamp, nonce, application specific data, and request MAC with the request using\nthe HTTP `Authorization` request header field:\n\n```\nGET /resource/1?b=1&a=2 HTTP/1.1\nHost: example.com:8000\nAuthorization: Hawk id=\"dh37fgj492je\", ts=\"1353832234\", nonce=\"j4h3g2\", ext=\"some-app-ext-data\", mac=\"6R4rV5iE+NPoym+WwjeHzjAGXUtLNIxmo1vpMofpLAE=\"\n```\n\nThe server validates the request by calculating the request MAC again based on the request received and verifies the validity\nand scope of the **Hawk** credentials. If valid, the server responds with the requested resource.\n\n\n### Payload Validation\n\n**Hawk** provides optional payload validation. When generating the authentication header, the client calculates a payload hash\nusing the specified hash algorithm. The hash is calculated over the concatenated value of (each followed by a newline character):\n* `hawk.1.payload`\n* the content-type in lowercase, without any parameters (e.g. `application/json`)\n* the request payload prior to any content encoding (the exact representation requirements should be specified by the server for payloads other than simple single-part ascii to ensure interoperability)\n\nFor example:\n\n* Payload: `Thank you for flying Hawk`\n* Content Type: `text/plain`\n* Hash (sha256): `Yi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=`\n\nResults in the following input to the payload hash function (newline terminated values):\n\n```\nhawk.1.payload\ntext/plain\nThank you for flying Hawk\n\n```\n\nWhich produces the following hash value:\n\n```\nYi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=\n```\n\nThe client constructs the normalized request string (newline terminated values):\n\n```\nhawk.1.header\n1353832234\nj4h3g2\nPOST\n/resource/1?a=1&b=2\nexample.com\n8000\nYi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=\nsome-app-ext-data\n\n```\n\nThen calculates the request MAC and includes the **Hawk** key identifier, timestamp, nonce, payload hash, application specific data,\nand request MAC, with the request using the HTTP `Authorization` request header field:\n\n```\nPOST /resource/1?a=1&b=2 HTTP/1.1\nHost: example.com:8000\nAuthorization: Hawk id=\"dh37fgj492je\", ts=\"1353832234\", nonce=\"j4h3g2\", hash=\"Yi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=\", ext=\"some-app-ext-data\", mac=\"aSe1DERmZuRl3pI36/9BdZmnErTw3sNzOOAUlfeKjVw=\"\n```\n\nIt is up to the server if and when it validates the payload for any given request, based solely on it's security policy\nand the nature of the data included.\n\nIf the payload is available at the time of authentication, the server uses the hash value provided by the client to construct\nthe normalized string and validates the MAC. If the MAC is valid, the server calculates the payload hash and compares the value\nwith the provided payload hash in the header. In many cases, checking the MAC first is faster than calculating the payload hash.\n\nHowever, if the payload is not available at authentication time (e.g. too large to fit in memory, streamed elsewhere, or processed\nat a different stage in the application), the server may choose to defer payload validation for later by retaining the hash value\nprovided by the client after validating the MAC.\n\nIt is important to note that MAC validation does not mean the hash value provided by the client is valid, only that the value\nincluded in the header was not modified. Without calculating the payload hash on the server and comparing it to the value provided\nby the client, the payload may be modified by an attacker.\n\n\n## Response Payload Validation\n\n**Hawk** provides partial response payload validation. The server includes the `Server-Authorization` response header which enables the\nclient to authenticate the response and ensure it is talking to the right server. **Hawk** defines the HTTP `Server-Authorization` header\nas a response header using the exact same syntax as the `Authorization` request header field.\n\nThe header is contructed using the same process as the client's request header. The server uses the same credentials and other\nartifacts provided by the client to constructs the normalized request string. The `ext` and `hash` values are replaced with\nnew values based on the server response. The rest as identical to those used by the client.\n\nThe result MAC digest is included with the optional `hash` and `ext` values:\n\n```\nServer-Authorization: Hawk mac=\"XIJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"\n```\n\n\n## Browser Support and Considerations\n\nA browser script is provided for including using a `<script>` tag in [lib/browser.js](/lib/browser.js). It's also a [component](http://component.io/hueniverse/hawk).\n\n**Hawk** relies on the _Server-Authorization_ and _WWW-Authenticate_ headers in its response to communicate with the client.\nTherefore, in case of CORS requests, it is important to consider sending _Access-Control-Expose-Headers_ with the value\n_\"WWW-Authenticate, Server-Authorization\"_ on each response from your server. As explained in the\n[specifications](http://www.w3.org/TR/cors/#access-control-expose-headers-response-header), it will indicate that these headers\ncan safely be accessed by the client (using getResponseHeader() on the XmlHttpRequest object). Otherwise you will be met with a\n[\"simple response header\"](http://www.w3.org/TR/cors/#simple-response-header) which excludes these fields and would prevent the\nHawk client from authenticating the requests.You can read more about the why and how in this\n[article](http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server)\n\n\n# Single URI Authorization\n\nThere are cases in which limited and short-term access to a protected resource is granted to a third party which does not\nhave access to the shared credentials. For example, displaying a protected image on a web page accessed by anyone. **Hawk**\nprovides limited support for such URIs in the form of a _bewit_ - a URI query parameter appended to the request URI which contains\nthe necessary credentials to authenticate the request.\n\nBecause of the significant security risks involved in issuing such access, bewit usage is purposely limited only to GET requests\nand for a finite period of time. Both the client and server can issue bewit credentials, however, the server should not use the same\ncredentials as the client to maintain clear traceability as to who issued which credentials.\n\nIn order to simplify implementation, bewit credentials do not support single-use policy and can be replayed multiple times within\nthe granted access timeframe. \n\n\n## Bewit Usage Example\n\nServer code:\n\n```javascript\nvar Http = require('http');\nvar Hawk = require('hawk');\n\n\n// Credentials lookup function\n\nvar credentialsFunc = function (id, callback) {\n\n var credentials = {\n key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\n algorithm: 'sha256'\n };\n\n return callback(null, credentials);\n};\n\n// Create HTTP server\n\nvar handler = function (req, res) {\n\n Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\n\n res.writeHead(!err ? 200 : 401, { 'Content-Type': 'text/plain' });\n res.end(!err ? 'Access granted' : 'Shoosh!');\n });\n};\n\nHttp.createServer(handler).listen(8000, 'example.com');\n```\n\nBewit code generation:\n\n```javascript\nvar Request = require('request');\nvar Hawk = require('hawk');\n\n\n// Client credentials\n\nvar credentials = {\n id: 'dh37fgj492je',\n key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\n algorithm: 'sha256'\n}\n\n// Generate bewit\n\nvar duration = 60 * 5; // 5 Minutes\nvar bewit = Hawk.uri.getBewit('http://example.com:8080/resource/1?b=1&a=2', { credentials: credentials, ttlSec: duration, ext: 'some-app-data' });\nvar uri = 'http://example.com:8000/resource/1?b=1&a=2' + '&bewit=' + bewit;\n```\n\n\n# Security Considerations\n\nThe greatest sources of security risks are usually found not in **Hawk** but in the policies and procedures surrounding its use.\nImplementers are strongly encouraged to assess how this module addresses their security requirements. This section includes\nan incomplete list of security considerations that must be reviewed and understood before deploying **Hawk** on the server.\nMany of the protections provided in **Hawk** depends on whether and how they are used.\n\n### MAC Keys Transmission\n\n**Hawk** does not provide any mechanism for obtaining or transmitting the set of shared credentials required. Any mechanism used\nto obtain **Hawk** credentials must ensure that these transmissions are protected using transport-layer mechanisms such as TLS.\n\n### Confidentiality of Requests\n\nWhile **Hawk** provides a mechanism for verifying the integrity of HTTP requests, it provides no guarantee of request\nconfidentiality. Unless other precautions are taken, eavesdroppers will have full access to the request content. Servers should\ncarefully consider the types of data likely to be sent as part of such requests, and employ transport-layer security mechanisms\nto protect sensitive resources.\n\n### Spoofing by Counterfeit Servers\n\n**Hawk** provides limited verification of the server authenticity. When receiving a response back from the server, the server\nmay choose to include a response `Server-Authorization` header which the client can use to verify the response. However, it is up to\nthe server to determine when such measure is included, to up to the client to enforce that policy.\n\nA hostile party could take advantage of this by intercepting the client's requests and returning misleading or otherwise\nincorrect responses. Service providers should consider such attacks when developing services using this protocol, and should\nrequire transport-layer security for any requests where the authenticity of the resource server or of server responses is an issue.\n\n### Plaintext Storage of Credentials\n\nThe **Hawk** key functions the same way passwords do in traditional authentication systems. In order to compute the request MAC,\nthe server must have access to the key in plaintext form. This is in contrast, for example, to modern operating systems, which\nstore only a one-way hash of user credentials.\n\nIf an attacker were to gain access to these keys - or worse, to the server's database of all such keys - he or she would be able\nto perform any action on behalf of any resource owner. Accordingly, it is critical that servers protect these keys from unauthorized\naccess.\n\n### Entropy of Keys\n\nUnless a transport-layer security protocol is used, eavesdroppers will have full access to authenticated requests and request\nMAC values, and will thus be able to mount offline brute-force attacks to recover the key used. Servers should be careful to\nassign keys which are long enough, and random enough, to resist such attacks for at least the length of time that the **Hawk**\ncredentials are valid.\n\nFor example, if the credentials are valid for two weeks, servers should ensure that it is not possible to mount a brute force\nattack that recovers the key in less than two weeks. Of course, servers are urged to err on the side of caution, and use the\nlongest key reasonable.\n\nIt is equally important that the pseudo-random number generator (PRNG) used to generate these keys be of sufficiently high\nquality. Many PRNG implementations generate number sequences that may appear to be random, but which nevertheless exhibit\npatterns or other weaknesses which make cryptanalysis or brute force attacks easier. Implementers should be careful to use\ncryptographically secure PRNGs to avoid these problems.\n\n### Coverage Limitations\n\nThe request MAC only covers the HTTP `Host` header and optionally the `Content-Type` header. It does not cover any other headers\nwhich can often affect how the request body is interpreted by the server. If the server behavior is influenced by the presence\nor value of such headers, an attacker can manipulate the request headers without being detected. Implementers should use the\n`ext` feature to pass application-specific information via the `Authorization` header which is protected by the request MAC.\n\nThe response authentication, when performed, only covers the response payload, content-type, and the request information \nprovided by the client in it's request (method, resource, timestamp, nonce, etc.). It does not cover the HTTP status code or\nany other response header field (e.g. Location) which can affect the client's behaviour.\n\n### Future Time Manipulation\n\nThe protocol relies on a clock sync between the client and server. To accomplish this, the server informs the client of its\ncurrent time when an invalid timestamp is received.\n\nIf an attacker is able to manipulate this information and cause the client to use an incorrect time, it would be able to cause\nthe client to generate authenticated requests using time in the future. Such requests will fail when sent by the client, and will\nnot likely leave a trace on the server (given the common implementation of nonce, if at all enforced). The attacker will then\nbe able to replay the request at the correct time without detection.\n\nThe client must only use the time information provided by the server if:\n* it was delivered over a TLS connection and the server identity has been verified, or\n* the `tsm` MAC digest calculated using the same client credentials over the timestamp has been verified.\n\n### Client Clock Poisoning\n\nWhen receiving a request with a bad timestamp, the server provides the client with its current time. The client must never use\nthe time received from the server to adjust its own clock, and must only use it to calculate an offset for communicating with\nthat particular server.\n\n### Bewit Limitations\n\nSpecial care must be taken when issuing bewit credentials to third parties. Bewit credentials are valid until expiration and cannot\nbe revoked or limited without using other means. Whatever resource they grant access to will be completely exposed to anyone with\naccess to the bewit credentials which act as bearer credentials for that particular resource. While bewit usage is limited to GET\nrequests only and therefore cannot be used to perform transactions or change server state, it can still be used to expose private\nand sensitive information.\n\n### Host Header Forgery\n\nHawk validates the incoming request MAC against the incoming HTTP Host header. However, unless the optional `host` and `port`\noptions are used with `server.authenticate()`, a malicous client can mint new host names pointing to the server's IP address and\nuse that to craft an attack by sending a valid request that's meant for another hostname than the one used by the server. Server\nimplementors must manually verify that the host header received matches their expectation (or use the options mentioned above).\n\n# Frequently Asked Questions\n\n### Where is the protocol specification?\n\nIf you are looking for some prose explaining how all this works, **this is it**. **Hawk** is being developed as an open source\nproject instead of a standard. In other words, the [code](/hueniverse/hawk/tree/master/lib) is the specification. Not sure about\nsomething? Open an issue!\n\n### Is it done?\n\nAs of version 0.10.0, **Hawk** is feature-complete. However, until this module reaches version 1.0.0 it is considered experimental\nand is likely to change. This also means your feedback and contribution are very welcome. Feel free to open issues with questions\nand suggestions.\n\n### Where can I find **Hawk** implementations in other languages?\n\n**Hawk**'s only reference implementation is provided in JavaScript as a node.js module. However, it has been ported to other languages.\nThe full list is maintained [here](https://github.com/hueniverse/hawk/issues?labels=port&state=closed). Please add an issue if you are\nworking on another port. A cross-platform test-suite is in the works.\n\n### Why isn't the algorithm part of the challenge or dynamically negotiated?\n\nThe algorithm used is closely related to the key issued as different algorithms require different key sizes (and other\nrequirements). While some keys can be used for multiple algorithm, the protocol is designed to closely bind the key and algorithm\ntogether as part of the issued credentials.\n\n### Why is Host and Content-Type the only headers covered by the request MAC?\n\nIt is really hard to include other headers. Headers can be changed by proxies and other intermediaries and there is no\nwell-established way to normalize them. Many platforms change the case of header field names and values. The only\nstraight-forward solution is to include the headers in some blob (say, base64 encoded JSON) and include that with the request,\nan approach taken by JWT and other such formats. However, that design violates the HTTP header boundaries, repeats information,\nand introduces other security issues because firewalls will not be aware of these \"hidden\" headers. In addition, any information\nrepeated must be compared to the duplicated information in the header and therefore only moves the problem elsewhere.\n\n### Why not just use HTTP Digest?\n\nDigest requires pre-negotiation to establish a nonce. This means you can't just make a request - you must first send\na protocol handshake to the server. This pattern has become unacceptable for most web services, especially mobile\nwhere extra round-trip are costly.\n\n### Why bother with all this nonce and timestamp business?\n\n**Hawk** is an attempt to find a reasonable, practical compromise between security and usability. OAuth 1.0 got timestamp\nand nonces halfway right but failed when it came to scalability and consistent developer experience. **Hawk** addresses\nit by requiring the client to sync its clock, but provides it with tools to accomplish it.\n\nIn general, replay protection is a matter of application-specific threat model. It is less of an issue on a TLS-protected\nsystem where the clients are implemented using best practices and are under the control of the server. Instead of dropping\nreplay protection, **Hawk** offers a required time window and an optional nonce verification. Together, it provides developers\nwith the ability to decide how to enforce their security policy without impacting the client's implementation.\n\n### What are `app` and `dlg` in the authorization header and normalized mac string?\n\nThe original motivation for **Hawk** was to replace the OAuth 1.0 use cases. This included both a simple client-server mode which\nthis module is specifically designed for, and a delegated access mode which is being developed separately in\n[Oz](https://github.com/hueniverse/oz). In addition to the **Hawk** use cases, Oz requires another attribute: the application id `app`.\nThis provides binding between the credentials and the application in a way that prevents an attacker from tricking an application\nto use credentials issued to someone else. It also has an optional 'delegated-by' attribute `dlg` which is the application id of the\napplication the credentials were directly issued to. The goal of these two additions is to allow Oz to utilize **Hawk** directly,\nbut with the additional security of delegated credentials.\n\n### What is the purpose of the static strings used in each normalized MAC input?\n\nWhen calculating a hash or MAC, a static prefix (tag) is added. The prefix is used to prevent MAC values from being\nused or reused for a purpose other than what they were created for (i.e. prevents switching MAC values between a request,\nresponse, and a bewit use cases). It also protects against exploits created after a potential change in how the protocol\ncreates the normalized string. For example, if a future version would switch the order of nonce and timestamp, it\ncan create an exploit opportunity for cases where the nonce is similar in format to a timestamp.\n\n### Does **Hawk** have anything to do with OAuth?\n\nShort answer: no.\n\n**Hawk** was originally proposed as the OAuth MAC Token specification. However, the OAuth working group in its consistent\nincompetence failed to produce a final, usable solution to address one of the most popular use cases of OAuth 1.0 - using it\nto authenticate simple client-server transactions (i.e. two-legged). As you can guess, the OAuth working group is still hard\nat work to produce more garbage.\n\n**Hawk** provides a simple HTTP authentication scheme for making client-server requests. It does not address the OAuth use case\nof delegating access to a third party. If you are looking for an OAuth alternative, check out [Oz](https://github.com/hueniverse/oz).\n\n# Implementations\n\n- [Logibit Hawk in F#/.Net](https://github.com/logibit/logibit.hawk/)\n- [Tent Hawk in Ruby](https://github.com/tent/hawk-ruby)\n- [Wealdtech in Java](https://github.com/wealdtech/hawk)\n- [Kumar's Mohawk in Python](https://github.com/kumar303/mohawk/)\n\n# Acknowledgements\n\n**Hawk** is a derivative work of the [HTTP MAC Authentication Scheme](http://tools.ietf.org/html/draft-hammer-oauth-v2-mac-token-05) proposal\nco-authored by Ben Adida, Adam Barth, and Eran Hammer, which in turn was based on the OAuth 1.0 community specification.\n\nSpecial thanks to Ben Laurie for his always insightful feedback and advice.\n\nThe **Hawk** logo was created by [Chris Carrasco](http://chriscarrasco.com).\n",
+ "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/hueniverse/hawk/issues"
},
- "homepage": "https://github.com/hueniverse/hawk",
+ "homepage": "https://github.com/hueniverse/hawk#readme",
"_id": "hawk@2.3.1",
"_shasum": "1e731ce39447fa1d0f6d707f7bceebec0fd1ec1f",
- "_from": "hawk@>=2.3.0 <2.4.0",
- "_npmVersion": "1.4.28",
- "_npmUser": {
- "name": "hueniverse",
- "email": "eran@hueniverse.com"
- },
- "maintainers": [
- {
- "name": "hueniverse",
- "email": "eran@hueniverse.com"
- }
- ],
- "dist": {
- "shasum": "1e731ce39447fa1d0f6d707f7bceebec0fd1ec1f",
- "tarball": "http://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz"
+ "_resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz",
+ "_from": "hawk@>=2.3.0 <2.4.0"
}
diff --git a/node_modules/request/node_modules/http-signature/lib/index.js b/node_modules/request/node_modules/http-signature/lib/index.js
index 217a5ddeb..56a9967da 100644
--- a/node_modules/request/node_modules/http-signature/lib/index.js
+++ b/node_modules/request/node_modules/http-signature/lib/index.js
@@ -1,4 +1,4 @@
-// Copyright 2011 Joyent, Inc. All rights reserved.
+// Copyright 2015 Joyent, Inc.
var parser = require('./parser');
var signer = require('./signer');
@@ -22,5 +22,6 @@ module.exports = {
pemToRsaSSHKey: util.pemToRsaSSHKey,
verify: verify.verifySignature,
- verifySignature: verify.verifySignature
+ verifySignature: verify.verifySignature,
+ verifyHMAC: verify.verifyHMAC
};
diff --git a/node_modules/request/node_modules/http-signature/lib/util.js b/node_modules/request/node_modules/http-signature/lib/util.js
index e7d915e76..2e1ce4d46 100644
--- a/node_modules/request/node_modules/http-signature/lib/util.js
+++ b/node_modules/request/node_modules/http-signature/lib/util.js
@@ -246,12 +246,12 @@ module.exports = {
},
/**
- * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa)
- *
- * The reverse of the above function.
- */
+ * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa)
+ *
+ * The reverse of the above function.
+ */
pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) {
- assert.equal('string', typeof pem, 'typeof pem');
+ assert.equal('string', typeof (pem), 'typeof pem');
// chop off the BEGIN PUBLIC KEY and END PUBLIC KEY portion
var cleaned = pem.split('\n').slice(1, -2).join('');
@@ -289,7 +289,8 @@ module.exports = {
// now, make the key
var type = new Buffer('ssh-rsa');
- var buffer = new Buffer(4 + type.length + 4 + modulus.length + 4 + exponent.length);
+ var buffer = new Buffer(4 + type.length + 4 + modulus.length +
+ 4 + exponent.length);
var i = 0;
buffer.writeUInt32BE(type.length, i); i += 4;
type.copy(buffer, i); i += type.length;
@@ -298,7 +299,8 @@ module.exports = {
buffer.writeUInt32BE(modulus.length, i); i += 4;
modulus.copy(buffer, i); i += modulus.length;
- var s = type.toString() + ' ' + buffer.toString('base64') + ' ' + (comment || '');
+ var s = (type.toString() + ' ' + buffer.toString('base64') + ' ' +
+ (comment || ''));
return s;
}
};
diff --git a/node_modules/request/node_modules/http-signature/lib/verify.js b/node_modules/request/node_modules/http-signature/lib/verify.js
index 5bf958964..f6ad0c2b1 100644
--- a/node_modules/request/node_modules/http-signature/lib/verify.js
+++ b/node_modules/request/node_modules/http-signature/lib/verify.js
@@ -1,4 +1,4 @@
-// Copyright 2011 Joyent, Inc. All rights reserved.
+// Copyright 2015 Joyent, Inc.
var assert = require('assert-plus');
var crypto = require('crypto');
@@ -8,35 +8,49 @@ var crypto = require('crypto');
///--- Exported API
module.exports = {
-
/**
- * Simply wraps up the node crypto operations for you, and returns
- * true or false. You are expected to pass in an object that was
- * returned from `parse()`.
+ * Verify RSA/DSA signature against public key. You are expected to pass in
+ * an object that was returned from `parse()`.
*
* @param {Object} parsedSignature the object you got from `parse`.
- * @param {String} key either an RSA private key PEM or HMAC secret.
+ * @param {String} pubkey RSA/DSA private key PEM.
* @return {Boolean} true if valid, false otherwise.
* @throws {TypeError} if you pass in bad arguments.
*/
- verifySignature: function verifySignature(parsedSignature, key) {
+ verifySignature: function verifySignature(parsedSignature, pubkey) {
assert.object(parsedSignature, 'parsedSignature');
- assert.string(key, 'key');
+ assert.string(pubkey, 'pubkey');
- var alg = parsedSignature.algorithm.match(/(HMAC|RSA|DSA)-(\w+)/);
+ var alg = parsedSignature.algorithm.match(/^(RSA|DSA)-(\w+)/);
if (!alg || alg.length !== 3)
throw new TypeError('parsedSignature: unsupported algorithm ' +
parsedSignature.algorithm);
- if (alg[1] === 'HMAC') {
- var hmac = crypto.createHmac(alg[2].toUpperCase(), key);
- hmac.update(parsedSignature.signingString);
- return (hmac.digest('base64') === parsedSignature.params.signature);
- } else {
- var verify = crypto.createVerify(alg[0]);
- verify.update(parsedSignature.signingString);
- return verify.verify(key, parsedSignature.params.signature, 'base64');
- }
- }
+ var verify = crypto.createVerify(alg[0]);
+ verify.update(parsedSignature.signingString);
+ return verify.verify(pubkey, parsedSignature.params.signature, 'base64');
+ },
+ /**
+ * Verify HMAC against shared secret. You are expected to pass in an object
+ * that was returned from `parse()`.
+ *
+ * @param {Object} parsedSignature the object you got from `parse`.
+ * @param {String} secret HMAC shared secret.
+ * @return {Boolean} true if valid, false otherwise.
+ * @throws {TypeError} if you pass in bad arguments.
+ */
+ verifyHMAC: function verifyHMAC(parsedSignature, secret) {
+ assert.object(parsedSignature, 'parsedHMAC');
+ assert.string(secret, 'secret');
+
+ var alg = parsedSignature.algorithm.match(/^HMAC-(\w+)/);
+ if (!alg || alg.length !== 2)
+ throw new TypeError('parsedSignature: unsupported algorithm ' +
+ parsedSignature.algorithm);
+
+ var hmac = crypto.createHmac(alg[1].toUpperCase(), secret);
+ hmac.update(parsedSignature.signingString);
+ return (hmac.digest('base64') === parsedSignature.params.signature);
+ }
};
diff --git a/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json b/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json
index aca7cedeb..034c2b48f 100644
--- a/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json
+++ b/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json
@@ -30,28 +30,15 @@
},
"scripts": {
"pretest": "which gjslint; if [[ \"$?\" = 0 ]] ; then gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi",
- "test": "./node_modules/.bin/tap ./tst"
+ "test": "tap ./tst"
},
- "_npmUser": {
- "name": "mcavage",
- "email": "mcavage@gmail.com"
+ "readme": "node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS.\nCurrently BER encoding is supported; at some point I'll likely have to do DER.\n\n## Usage\n\nMostly, if you're *actually* needing to read and write ASN.1, you probably don't\nneed this readme to explain what and why. If you have no idea what ASN.1 is,\nsee this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nThe source is pretty much self-explanatory, and has read/write methods for the\ncommon types out there.\n\n### Decoding\n\nThe following reads an ASN.1 sequence with a boolean.\n\n var Ber = require('asn1').Ber;\n\n var reader = new Ber.Reader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));\n\n reader.readSequence();\n console.log('Sequence len: ' + reader.length);\n if (reader.peek() === Ber.Boolean)\n console.log(reader.readBoolean());\n\n### Encoding\n\nThe following generates the same payload as above.\n\n var Ber = require('asn1').Ber;\n\n var writer = new Ber.Writer();\n\n writer.startSequence();\n writer.writeBoolean(true);\n writer.endSequence();\n\n console.log(writer.buffer);\n\n## Installation\n\n npm install asn1\n\n## License\n\nMIT.\n\n## Bugs\n\nSee <https://github.com/mcavage/node-asn1/issues>.\n",
+ "readmeFilename": "README.md",
+ "bugs": {
+ "url": "https://github.com/mcavage/node-asn1/issues"
},
+ "homepage": "https://github.com/mcavage/node-asn1#readme",
"_id": "asn1@0.1.11",
- "_engineSupported": true,
- "_npmVersion": "1.1.0-beta-4",
- "_nodeVersion": "v0.6.6",
- "_defaultsLoaded": true,
- "dist": {
- "shasum": "559be18376d08a4ec4dbe80877d27818639b2df7",
- "tarball": "http://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz"
- },
- "maintainers": [
- {
- "name": "mcavage",
- "email": "mcavage@gmail.com"
- }
- ],
- "directories": {},
"_shasum": "559be18376d08a4ec4dbe80877d27818639b2df7",
"_resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz",
"_from": "asn1@0.1.11"
diff --git a/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json b/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
index 095081582..b3317675d 100644
--- a/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
+++ b/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
@@ -11,33 +11,20 @@
"optionalDependencies": {},
"repository": {
"type": "git",
- "url": "https://github.com/mcavage/node-assert-plus.git"
+ "url": "git+https://github.com/mcavage/node-assert-plus.git"
},
"engines": {
"node": ">=0.8"
},
+ "readme": "# node-assert-plus\n\nThis library is a super small wrapper over node's assert module that has two\nthings: (1) the ability to disable assertions with the environment variable\nNODE_NDEBUG, and (2) some API wrappers for argument testing. Like\n`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks\nlike this:\n\n var assert = require('assert-plus');\n\n function fooAccount(options, callback) {\n\t assert.object(options, 'options');\n\t\tassert.number(options.id, 'options.id);\n\t\tassert.bool(options.isManager, 'options.isManager');\n\t\tassert.string(options.name, 'options.name');\n\t\tassert.arrayOfString(options.email, 'options.email');\n\t\tassert.func(callback, 'callback');\n\n // Do stuff\n\t\tcallback(null, {});\n }\n\n# API\n\nAll methods that *aren't* part of node's core assert API are simply assumed to\ntake an argument, and then a string 'name' that's not a message; `AssertionError`\nwill be thrown if the assertion fails with a message like:\n\n AssertionError: foo (string) is required\n\tat test (/home/mark/work/foo/foo.js:3:9)\n\tat Object.<anonymous> (/home/mark/work/foo/foo.js:15:1)\n\tat Module._compile (module.js:446:26)\n\tat Object..js (module.js:464:10)\n\tat Module.load (module.js:353:31)\n\tat Function._load (module.js:311:12)\n\tat Array.0 (module.js:484:10)\n\tat EventEmitter._tickCallback (node.js:190:38)\n\nfrom:\n\n function test(foo) {\n\t assert.string(foo, 'foo');\n }\n\nThere you go. You can check that arrays are of a homogenous type with `Arrayof$Type`:\n\n function test(foo) {\n\t assert.arrayOfString(foo, 'foo');\n }\n\nYou can assert IFF an argument is not `undefined` (i.e., an optional arg):\n\n assert.optionalString(foo, 'foo');\n\nLastly, you can opt-out of assertion checking altogether by setting the\nenvironment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have\nlots of assertions, and don't want to pay `typeof ()` taxes to v8 in\nproduction.\n\nThe complete list of APIs is:\n\n* assert.bool\n* assert.buffer\n* assert.func\n* assert.number\n* assert.object\n* assert.string\n* assert.arrayOfBool\n* assert.arrayOfFunc\n* assert.arrayOfNumber\n* assert.arrayOfObject\n* assert.arrayOfString\n* assert.optionalBool\n* assert.optionalBuffer\n* assert.optionalFunc\n* assert.optionalNumber\n* assert.optionalObject\n* assert.optionalString\n* assert.optionalArrayOfBool\n* assert.optionalArrayOfFunc\n* assert.optionalArrayOfNumber\n* assert.optionalArrayOfObject\n* assert.optionalArrayOfString\n* assert.AssertionError\n* assert.fail\n* assert.ok\n* assert.equal\n* assert.notEqual\n* assert.deepEqual\n* assert.notDeepEqual\n* assert.strictEqual\n* assert.notStrictEqual\n* assert.throws\n* assert.doesNotThrow\n* assert.ifError\n\n# Installation\n\n npm install assert-plus\n\n## License\n\nThe MIT License (MIT)\nCopyright (c) 2012 Mark Cavage\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n## Bugs\n\nSee <https://github.com/mcavage/node-assert-plus/issues>.\n",
+ "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/mcavage/node-assert-plus/issues"
},
+ "homepage": "https://github.com/mcavage/node-assert-plus#readme",
"dependencies": {},
"_id": "assert-plus@0.1.5",
- "dist": {
- "shasum": "ee74009413002d84cec7219c6ac811812e723160",
- "tarball": "http://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz"
- },
- "_from": "assert-plus@>=0.1.5 <0.2.0",
- "_npmVersion": "1.3.11",
- "_npmUser": {
- "name": "mcavage",
- "email": "mcavage@gmail.com"
- },
- "maintainers": [
- {
- "name": "mcavage",
- "email": "mcavage@gmail.com"
- }
- ],
- "directories": {},
"_shasum": "ee74009413002d84cec7219c6ac811812e723160",
- "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz"
+ "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
+ "_from": "assert-plus@>=0.1.5 <0.2.0"
}
diff --git a/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json b/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json
index 9395bfcf8..2090a5ea3 100644
--- a/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json
+++ b/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json
@@ -13,25 +13,14 @@
"main": "ctype.js",
"repository": {
"type": "git",
- "url": "https://github.com/rmustacc/node-ctype.git"
+ "url": "git+https://github.com/rmustacc/node-ctype.git"
},
- "_id": "ctype@0.5.3",
- "dist": {
- "shasum": "82c18c2461f74114ef16c135224ad0b9144ca12f",
- "tarball": "http://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz"
- },
- "_npmVersion": "1.1.59",
- "_npmUser": {
- "name": "rm",
- "email": "rm@fingolfin.org"
+ "readme": "Node-CType is a way to read and write binary data in structured and easy to use\nformat. Its name comes from the C header file.\n\nTo get started, simply clone the repository or use npm to install it. Once it is\nthere, simply require it.\n\ngit clone git://github.com/rmustacc/node-ctype\nnpm install ctype\nvar mod_ctype = require('ctype')\n\n\nThere are two APIs that you can use, depending on what abstraction you'd like.\nThe low level API let's you read and write individual integers and floats from\nbuffers. The higher level API let's you read and write structures of these. To\nillustrate this, let's looks look at how we would read and write a binary\nencoded x,y point.\n\nIn C we would define this structure as follows:\n\ntypedef struct point {\n\tuint16_t\tp_x;\n\tuint16_t\tp_y;\n} point_t;\n\nTo read a binary encoded point from a Buffer, we first need to create a CType\nparser (where we specify the endian and other options) and add the typedef.\n\nvar parser = new mod_ctype.Parser({ endian: 'big' });\nparser.typedef('point_t', [\n\t{ x: { type: 'uint16_t' } },\n\t{ y: { type: 'uint16_t' } }\n]);\n\nFrom here, given a buffer buf and an offset into it, we can read a point.\n\nvar out = parser.readData([ { point: { type: 'point_t' } } ], buffer, 0);\nconsole.log(out);\n{ point: { x: 23, y: 42 } }\n\nAnother way to get the same information would be to use the low level methods.\nNote that these require you to manually deal with the offset. Here's how we'd\nget the same values of x and y from the buffer.\n\nvar x = mod_ctype.ruint16(buf, 'big', 0);\nvar y = mod_ctype.ruint16(buf, 'big', 2);\nconsole.log(x + ', ' + y);\n23, 42\n\nThe true power of this API comes from the ability to define and nest typedefs,\njust as you would in C. By default, the following types are defined by default.\nNote that they return a Number, unless indicated otherwise.\n\n * int8_t\n * int16_t\n * int32_t\n * int64_t (returns an array where val[0] << 32 + val[1] would be the value)\n * uint8_t\n * uint16_t\n * uint32_t\n * uint64_t (returns an array where val[0] << 32 + val[1] would be the value)\n * float\n * double\n * char (either returns a buffer with that character or a uint8_t)\n * char[] (returns an object with the buffer and the number of characters read which is either the total amount requested or until the first 0)\n\n\nctf2json integration:\n\nNode-CType supports consuming the output of ctf2json. Once you read in a JSON file,\nall you have to do to add all the definitions it contains is:\n\nvar data, parser;\ndata = JSON.parse(parsedJSONData);\nparser = mod_ctype.parseCTF(data, { endian: 'big' });\n\nFor more documentation, see the file README.old. Full documentation is in the\nprocess of being rewritten as a series of manual pages which will be available\nin the repository and online for viewing.\n\nTo read the ctio manual page simple run, from the root of the workspace:\n\nman -Mman -s 3ctype ctio\n",
+ "readmeFilename": "README",
+ "bugs": {
+ "url": "https://github.com/rmustacc/node-ctype/issues"
},
- "maintainers": [
- {
- "name": "rm",
- "email": "rm@fingolfin.org"
- }
- ],
- "directories": {},
+ "_id": "ctype@0.5.3",
"_shasum": "82c18c2461f74114ef16c135224ad0b9144ca12f",
"_resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz",
"_from": "ctype@0.5.3"
diff --git a/node_modules/request/node_modules/http-signature/package.json b/node_modules/request/node_modules/http-signature/package.json
index d93952bd3..91b86543f 100644
--- a/node_modules/request/node_modules/http-signature/package.json
+++ b/node_modules/request/node_modules/http-signature/package.json
@@ -1,7 +1,7 @@
{
"name": "http-signature",
"description": "Reference implementation of Joyent's HTTP Signature scheme.",
- "version": "0.10.1",
+ "version": "0.11.0",
"license": "MIT",
"author": {
"name": "Joyent, Inc"
@@ -14,6 +14,10 @@
{
"name": "David I. Lehn",
"email": "dil@lehn.org"
+ },
+ {
+ "name": "Patrick Mooney",
+ "email": "patrick.f.mooney@gmail.com"
}
],
"repository": {
@@ -44,11 +48,12 @@
"node-uuid": "^1.4.1",
"tap": "0.4.2"
},
- "_id": "http-signature@0.10.1",
- "_shasum": "4fbdac132559aa8323121e540779c0a012b27e66",
- "_resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
- "_from": "http-signature@>=0.10.0 <0.11.0",
- "_npmVersion": "1.4.28",
+ "_id": "http-signature@0.11.0",
+ "_shasum": "1796cf67a001ad5cd6849dca0991485f09089fe6",
+ "_resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz",
+ "_from": "http-signature@>=0.11.0 <0.12.0",
+ "_npmVersion": "2.5.1",
+ "_nodeVersion": "0.10.36",
"_npmUser": {
"name": "pfmooney",
"email": "patrick.f.mooney@gmail.com"
@@ -64,8 +69,8 @@
}
],
"dist": {
- "shasum": "4fbdac132559aa8323121e540779c0a012b27e66",
- "tarball": "http://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz"
+ "shasum": "1796cf67a001ad5cd6849dca0991485f09089fe6",
+ "tarball": "http://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz"
},
"directories": {}
}
diff --git a/node_modules/request/node_modules/isstream/package.json b/node_modules/request/node_modules/isstream/package.json
index 2c03471d1..d0338b882 100644
--- a/node_modules/request/node_modules/isstream/package.json
+++ b/node_modules/request/node_modules/isstream/package.json
@@ -8,7 +8,7 @@
},
"repository": {
"type": "git",
- "url": "https://github.com/rvagg/isstream.git"
+ "url": "git+https://github.com/rvagg/isstream.git"
},
"keywords": [
"stream",
@@ -33,26 +33,10 @@
"url": "https://github.com/rvagg/isstream/issues"
},
"homepage": "https://github.com/rvagg/isstream",
- "gitHead": "cd39cba6da939b4fc9110825203adc506422c3dc",
+ "readme": "# isStream\n\n[![Build Status](https://secure.travis-ci.org/rvagg/isstream.png)](http://travis-ci.org/rvagg/isstream)\n\n**Test if an object is a `Stream`**\n\n[![NPM](https://nodei.co/npm/isstream.svg)](https://nodei.co/npm/isstream/)\n\nThe missing `Stream.isStream(obj)`: determine if an object is standard Node.js `Stream`. Works for Node-core `Stream` objects (for 0.8, 0.10, 0.11, and in theory, older and newer versions) and all versions of **[readable-stream](https://github.com/isaacs/readable-stream)**.\n\n## Usage:\n\n```js\nvar isStream = require('isstream')\nvar Stream = require('stream')\n\nisStream(new Stream()) // true\n\nisStream({}) // false\n\nisStream(new Stream.Readable()) // true\nisStream(new Stream.Writable()) // true\nisStream(new Stream.Duplex()) // true\nisStream(new Stream.Transform()) // true\nisStream(new Stream.PassThrough()) // true\n```\n\n## But wait! There's more!\n\nYou can also test for `isReadable(obj)`, `isWritable(obj)` and `isDuplex(obj)` to test for implementations of Streams2 (and Streams3) base classes.\n\n```js\nvar isReadable = require('isstream').isReadable\nvar isWritable = require('isstream').isWritable\nvar isDuplex = require('isstream').isDuplex\nvar Stream = require('stream')\n\nisReadable(new Stream()) // false\nisWritable(new Stream()) // false\nisDuplex(new Stream()) // false\n\nisReadable(new Stream.Readable()) // true\nisReadable(new Stream.Writable()) // false\nisReadable(new Stream.Duplex()) // true\nisReadable(new Stream.Transform()) // true\nisReadable(new Stream.PassThrough()) // true\n\nisWritable(new Stream.Readable()) // false\nisWritable(new Stream.Writable()) // true\nisWritable(new Stream.Duplex()) // true\nisWritable(new Stream.Transform()) // true\nisWritable(new Stream.PassThrough()) // true\n\nisDuplex(new Stream.Readable()) // false\nisDuplex(new Stream.Writable()) // false\nisDuplex(new Stream.Duplex()) // true\nisDuplex(new Stream.Transform()) // true\nisDuplex(new Stream.PassThrough()) // true\n```\n\n*Reminder: when implementing your own streams, please [use **readable-stream** rather than core streams](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).*\n\n\n## License\n\n**isStream** is Copyright (c) 2015 Rod Vagg [@rvagg](https://twitter.com/rvagg) and licenced under the MIT licence. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.\n",
+ "readmeFilename": "README.md",
"_id": "isstream@0.1.2",
"_shasum": "47e63f7af55afa6f92e1500e690eb8b8529c099a",
- "_from": "isstream@>=0.1.1 <0.2.0",
- "_npmVersion": "2.6.1",
- "_nodeVersion": "1.4.3",
- "_npmUser": {
- "name": "rvagg",
- "email": "rod@vagg.org"
- },
- "maintainers": [
- {
- "name": "rvagg",
- "email": "rod@vagg.org"
- }
- ],
- "dist": {
- "shasum": "47e63f7af55afa6f92e1500e690eb8b8529c099a",
- "tarball": "http://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ "_resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "_from": "isstream@>=0.1.1 <0.2.0"
}
diff --git a/node_modules/request/node_modules/json-stringify-safe/.npmignore b/node_modules/request/node_modules/json-stringify-safe/.npmignore
new file mode 100644
index 000000000..17d6b3677
--- /dev/null
+++ b/node_modules/request/node_modules/json-stringify-safe/.npmignore
@@ -0,0 +1 @@
+/*.tgz
diff --git a/node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md b/node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md
new file mode 100644
index 000000000..42bcb60af
--- /dev/null
+++ b/node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md
@@ -0,0 +1,14 @@
+## Unreleased
+- Fixes stringify to only take ancestors into account when checking
+ circularity.
+ It previously assumed every visited object was circular which led to [false
+ positives][issue9].
+ Uses the tiny serializer I wrote for [Must.js][must] a year and a half ago.
+- Fixes calling the `replacer` function in the proper context (`thisArg`).
+- Fixes calling the `cycleReplacer` function in the proper context (`thisArg`).
+- Speeds serializing by a factor of
+ Big-O(h-my-god-it-linearly-searched-every-object) it had ever seen. Searching
+ only the ancestors for a circular references speeds up things considerably.
+
+[must]: https://github.com/moll/js-must
+[issue9]: https://github.com/isaacs/json-stringify-safe/issues/9
diff --git a/node_modules/request/node_modules/json-stringify-safe/LICENSE b/node_modules/request/node_modules/json-stringify-safe/LICENSE
index 0c44ae716..19129e315 100644
--- a/node_modules/request/node_modules/json-stringify-safe/LICENSE
+++ b/node_modules/request/node_modules/json-stringify-safe/LICENSE
@@ -1,27 +1,15 @@
-Copyright (c) Isaac Z. Schlueter ("Author")
-All rights reserved.
+The ISC License
-The BSD License
+Copyright (c) Isaac Z. Schlueter and Contributors
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
+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.
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 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/request/node_modules/json-stringify-safe/Makefile b/node_modules/request/node_modules/json-stringify-safe/Makefile
new file mode 100644
index 000000000..36088c723
--- /dev/null
+++ b/node_modules/request/node_modules/json-stringify-safe/Makefile
@@ -0,0 +1,35 @@
+NODE_OPTS =
+TEST_OPTS =
+
+love:
+ @echo "Feel like makin' love."
+
+test:
+ @node $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot $(TEST_OPTS)
+
+spec:
+ @node $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec $(TEST_OPTS)
+
+autotest:
+ @node $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot --watch $(TEST_OPTS)
+
+autospec:
+ @node $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec --watch $(TEST_OPTS)
+
+pack:
+ @file=$$(npm pack); echo "$$file"; tar tf "$$file"
+
+publish:
+ npm publish
+
+tag:
+ git tag "v$$(node -e 'console.log(require("./package").version)')"
+
+clean:
+ rm -f *.tgz
+ npm prune --production
+
+.PHONY: love
+.PHONY: test spec autotest autospec
+.PHONY: pack publish tag
+.PHONY: clean
diff --git a/node_modules/request/node_modules/json-stringify-safe/README.md b/node_modules/request/node_modules/json-stringify-safe/README.md
index 5d764f3a4..a11f302a3 100644
--- a/node_modules/request/node_modules/json-stringify-safe/README.md
+++ b/node_modules/request/node_modules/json-stringify-safe/README.md
@@ -47,3 +47,6 @@ stringify.getSerialize(serializer, decycler)
Returns a serializer that can be used elsewhere. This is the actual
function that's passed to JSON.stringify.
+
+**Note** that the function returned from `getSerialize` is stateful for now, so
+do **not** use it more than once.
diff --git a/node_modules/request/node_modules/json-stringify-safe/package.json b/node_modules/request/node_modules/json-stringify-safe/package.json
index 7551573fd..e3cbf9a74 100644
--- a/node_modules/request/node_modules/json-stringify-safe/package.json
+++ b/node_modules/request/node_modules/json-stringify-safe/package.json
@@ -1,48 +1,68 @@
{
"name": "json-stringify-safe",
- "version": "5.0.0",
- "description": "Like JSON.stringify, but doesn't blow up on circular refs",
- "main": "stringify.js",
- "scripts": {
- "test": "node test.js"
- },
- "repository": {
- "type": "git",
- "url": "git://github.com/isaacs/json-stringify-safe"
- },
+ "version": "5.0.1",
+ "description": "Like JSON.stringify, but doesn't blow up on circular refs.",
"keywords": [
"json",
"stringify",
"circular",
"safe"
],
+ "homepage": "https://github.com/isaacs/json-stringify-safe",
+ "bugs": {
+ "url": "https://github.com/isaacs/json-stringify-safe/issues"
+ },
"author": {
"name": "Isaac Z. Schlueter",
"email": "i@izs.me",
"url": "http://blog.izs.me"
},
- "license": "BSD",
- "bugs": {
- "url": "https://github.com/isaacs/json-stringify-safe/issues"
+ "contributors": [
+ {
+ "name": "Andri Möll",
+ "email": "andri@dot.ee",
+ "url": "http://themoll.com"
+ }
+ ],
+ "license": "ISC",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/json-stringify-safe.git"
},
- "_id": "json-stringify-safe@5.0.0",
- "dist": {
- "shasum": "4c1f228b5050837eba9d21f50c2e6e320624566e",
- "tarball": "http://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz"
+ "main": "stringify.js",
+ "scripts": {
+ "test": "node test.js"
+ },
+ "devDependencies": {
+ "mocha": ">= 2.1.0 < 3",
+ "must": ">= 0.12 < 0.13",
+ "sinon": ">= 1.12.2 < 2"
},
+ "gitHead": "3890dceab3ad14f8701e38ca74f38276abc76de5",
+ "_id": "json-stringify-safe@5.0.1",
+ "_shasum": "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb",
"_from": "json-stringify-safe@>=5.0.0 <5.1.0",
- "_npmVersion": "1.3.6",
+ "_npmVersion": "2.10.0",
+ "_nodeVersion": "2.0.1",
"_npmUser": {
"name": "isaacs",
- "email": "i@izs.me"
+ "email": "isaacs@npmjs.com"
+ },
+ "dist": {
+ "shasum": "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb",
+ "tarball": "http://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
},
"maintainers": [
{
"name": "isaacs",
"email": "i@izs.me"
+ },
+ {
+ "name": "moll",
+ "email": "andri@dot.ee"
}
],
"directories": {},
- "_shasum": "4c1f228b5050837eba9d21f50c2e6e320624566e",
- "_resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz"
+ "_resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/json-stringify-safe/stringify.js b/node_modules/request/node_modules/json-stringify-safe/stringify.js
index 853ef9b23..124a45218 100644
--- a/node_modules/request/node_modules/json-stringify-safe/stringify.js
+++ b/node_modules/request/node_modules/json-stringify-safe/stringify.js
@@ -1,39 +1,27 @@
-module.exports = stringify;
+exports = module.exports = stringify
+exports.getSerialize = serializer
-function getSerialize (fn, decycle) {
- var seen = [], keys = [];
- decycle = decycle || function(key, value) {
- return '[Circular ' + getPath(value, seen, keys) + ']'
- };
- return function(key, value) {
- var ret = value;
- if (typeof value === 'object' && value) {
- if (seen.indexOf(value) !== -1)
- ret = decycle(key, value);
- else {
- seen.push(value);
- keys.push(key);
- }
- }
- if (fn) ret = fn(key, ret);
- return ret;
- }
+function stringify(obj, replacer, spaces, cycleReplacer) {
+ return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)
}
-function getPath (value, seen, keys) {
- var index = seen.indexOf(value);
- var path = [ keys[index] ];
- for (index--; index >= 0; index--) {
- if (seen[index][ path[0] ] === value) {
- value = seen[index];
- path.unshift(keys[index]);
- }
+function serializer(replacer, cycleReplacer) {
+ var stack = [], keys = []
+
+ if (cycleReplacer == null) cycleReplacer = function(key, value) {
+ if (stack[0] === value) return "[Circular ~]"
+ return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"
}
- return '~' + path.join('.');
-}
-function stringify(obj, fn, spaces, decycle) {
- return JSON.stringify(obj, getSerialize(fn, decycle), spaces);
-}
+ return function(key, value) {
+ if (stack.length > 0) {
+ var thisPos = stack.indexOf(this)
+ ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)
+ ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)
+ if (~stack.indexOf(value)) value = cycleReplacer.call(this, key, value)
+ }
+ else stack.push(value)
-stringify.getSerialize = getSerialize;
+ return replacer == null ? value : replacer.call(this, key, value)
+ }
+}
diff --git a/node_modules/request/node_modules/json-stringify-safe/test.js b/node_modules/request/node_modules/json-stringify-safe/test.js
deleted file mode 100644
index 991e9197c..000000000
--- a/node_modules/request/node_modules/json-stringify-safe/test.js
+++ /dev/null
@@ -1,128 +0,0 @@
-var stringify = require('./stringify.js');
-
-var circularObj = { a: 'b' };
-circularObj.circularRef = circularObj;
-circularObj.list = [ circularObj, circularObj ];
-
-//////////
-// default
-var testObj = {
- "a": "b",
- "circularRef": "[Circular ~]",
- "list": [
- "[Circular ~]",
- "[Circular ~]"
- ]
-};
-
-var assert = require('assert');
-assert.equal(JSON.stringify(testObj, null, 2),
- stringify(circularObj, null, 2));
-
-assert.equal(JSON.stringify(testObj, null, 2),
- JSON.stringify(circularObj, stringify.getSerialize(), 2));
-
-
-////////
-// prune
-testObj = {
- "a": "b",
- "list": [
- null,
- null
- ]
-};
-
-function prune(k, v) {}
-
-assert.equal(JSON.stringify(testObj, null, 2),
- stringify(circularObj, null, 2, prune));
-
-///////////
-// re-cycle
-// (throws)
-function recycle(k, v) {
- return v;
-}
-
-assert.throws(function() {
- stringify(circularObj, null, 2, recycle);
-});
-
-////////
-// fancy
-testObj = {
- "a": "b",
- "circularRef": "circularRef{a:string,circularRef:Object,list:Array}",
- "list": [
- "0{a:string,circularRef:Object,list:Array}",
- "1{a:string,circularRef:Object,list:Array}"
- ]
-};
-
-function signer(key, value) {
- var ret = key + '{';
- var f = false;
- for (var i in value) {
- if (f)
- ret += ',';
- f = true;
- ret += i + ':';
- var v = value[i];
- switch (typeof v) {
- case 'object':
- if (!v)
- ret += 'null';
- else if (Array.isArray(v))
- ret += 'Array'
- else
- ret += v.constructor && v.constructor.name || 'Object';
- break;
- default:
- ret += typeof v;
- break;
- }
- }
- ret += '}';
- return ret;
-}
-
-assert.equal(JSON.stringify(testObj, null, 2),
- stringify(circularObj, null, 2, signer));
-
-
-///////
-//multi
-var a = { x: 1 };
-a.a = a;
-var b = { x: 2 };
-b.a = a;
-
-var c = { a: a, b: b };
-var d = { list: [ a, b, c ] };
-d.d = d;
-
-var multi = {
- "list": [
- {
- "x": 1,
- "a": "[Circular ~.list.0]"
- },
- {
- "x": 2,
- "a": "[Circular ~.list.0]"
- },
- {
- "a": "[Circular ~.list.0]",
- "b": "[Circular ~.list.1]"
- }
- ],
- "d": "[Circular ~]"
-};
-
-assert.equal(JSON.stringify(multi, null, 2),
- stringify(d, null, 2));
-
-////////
-// pass!
-console.log('ok');
diff --git a/node_modules/request/node_modules/json-stringify-safe/test/mocha.opts b/node_modules/request/node_modules/json-stringify-safe/test/mocha.opts
new file mode 100644
index 000000000..2544e5861
--- /dev/null
+++ b/node_modules/request/node_modules/json-stringify-safe/test/mocha.opts
@@ -0,0 +1,2 @@
+--recursive
+--require must
diff --git a/node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js b/node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js
new file mode 100644
index 000000000..5b3258317
--- /dev/null
+++ b/node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js
@@ -0,0 +1,246 @@
+var Sinon = require("sinon")
+var stringify = require("..")
+function jsonify(obj) { return JSON.stringify(obj, null, 2) }
+
+describe("Stringify", function() {
+ it("must stringify circular objects", function() {
+ var obj = {name: "Alice"}
+ obj.self = obj
+ var json = stringify(obj, null, 2)
+ json.must.eql(jsonify({name: "Alice", self: "[Circular ~]"}))
+ })
+
+ it("must stringify circular objects with intermediaries", function() {
+ var obj = {name: "Alice"}
+ obj.identity = {self: obj}
+ var json = stringify(obj, null, 2)
+ json.must.eql(jsonify({name: "Alice", identity: {self: "[Circular ~]"}}))
+ })
+
+ it("must stringify circular objects deeper", function() {
+ var obj = {name: "Alice", child: {name: "Bob"}}
+ obj.child.self = obj.child
+
+ stringify(obj, null, 2).must.eql(jsonify({
+ name: "Alice",
+ child: {name: "Bob", self: "[Circular ~.child]"}
+ }))
+ })
+
+ it("must stringify circular objects deeper with intermediaries", function() {
+ var obj = {name: "Alice", child: {name: "Bob"}}
+ obj.child.identity = {self: obj.child}
+
+ stringify(obj, null, 2).must.eql(jsonify({
+ name: "Alice",
+ child: {name: "Bob", identity: {self: "[Circular ~.child]"}}
+ }))
+ })
+
+ it("must stringify circular objects in an array", function() {
+ var obj = {name: "Alice"}
+ obj.self = [obj, obj]
+
+ stringify(obj, null, 2).must.eql(jsonify({
+ name: "Alice", self: ["[Circular ~]", "[Circular ~]"]
+ }))
+ })
+
+ it("must stringify circular objects deeper in an array", function() {
+ var obj = {name: "Alice", children: [{name: "Bob"}, {name: "Eve"}]}
+ obj.children[0].self = obj.children[0]
+ obj.children[1].self = obj.children[1]
+
+ stringify(obj, null, 2).must.eql(jsonify({
+ name: "Alice",
+ children: [
+ {name: "Bob", self: "[Circular ~.children.0]"},
+ {name: "Eve", self: "[Circular ~.children.1]"}
+ ]
+ }))
+ })
+
+ it("must stringify circular arrays", function() {
+ var obj = []
+ obj.push(obj)
+ obj.push(obj)
+ var json = stringify(obj, null, 2)
+ json.must.eql(jsonify(["[Circular ~]", "[Circular ~]"]))
+ })
+
+ it("must stringify circular arrays with intermediaries", function() {
+ var obj = []
+ obj.push({name: "Alice", self: obj})
+ obj.push({name: "Bob", self: obj})
+
+ stringify(obj, null, 2).must.eql(jsonify([
+ {name: "Alice", self: "[Circular ~]"},
+ {name: "Bob", self: "[Circular ~]"}
+ ]))
+ })
+
+ it("must stringify repeated objects in objects", function() {
+ var obj = {}
+ var alice = {name: "Alice"}
+ obj.alice1 = alice
+ obj.alice2 = alice
+
+ stringify(obj, null, 2).must.eql(jsonify({
+ alice1: {name: "Alice"},
+ alice2: {name: "Alice"}
+ }))
+ })
+
+ it("must stringify repeated objects in arrays", function() {
+ var alice = {name: "Alice"}
+ var obj = [alice, alice]
+ var json = stringify(obj, null, 2)
+ json.must.eql(jsonify([{name: "Alice"}, {name: "Alice"}]))
+ })
+
+ it("must call given decycler and use its output", function() {
+ var obj = {}
+ obj.a = obj
+ obj.b = obj
+
+ var decycle = Sinon.spy(function() { return decycle.callCount })
+ var json = stringify(obj, null, 2, decycle)
+ json.must.eql(jsonify({a: 1, b: 2}, null, 2))
+
+ decycle.callCount.must.equal(2)
+ decycle.thisValues[0].must.equal(obj)
+ decycle.args[0][0].must.equal("a")
+ decycle.args[0][1].must.equal(obj)
+ decycle.thisValues[1].must.equal(obj)
+ decycle.args[1][0].must.equal("b")
+ decycle.args[1][1].must.equal(obj)
+ })
+
+ it("must call replacer and use its output", function() {
+ var obj = {name: "Alice", child: {name: "Bob"}}
+
+ var replacer = Sinon.spy(bangString)
+ var json = stringify(obj, replacer, 2)
+ json.must.eql(jsonify({name: "Alice!", child: {name: "Bob!"}}))
+
+ replacer.callCount.must.equal(4)
+ replacer.args[0][0].must.equal("")
+ replacer.args[0][1].must.equal(obj)
+ replacer.thisValues[1].must.equal(obj)
+ replacer.args[1][0].must.equal("name")
+ replacer.args[1][1].must.equal("Alice")
+ replacer.thisValues[2].must.equal(obj)
+ replacer.args[2][0].must.equal("child")
+ replacer.args[2][1].must.equal(obj.child)
+ replacer.thisValues[3].must.equal(obj.child)
+ replacer.args[3][0].must.equal("name")
+ replacer.args[3][1].must.equal("Bob")
+ })
+
+ it("must call replacer after describing circular references", function() {
+ var obj = {name: "Alice"}
+ obj.self = obj
+
+ var replacer = Sinon.spy(bangString)
+ var json = stringify(obj, replacer, 2)
+ json.must.eql(jsonify({name: "Alice!", self: "[Circular ~]!"}))
+
+ replacer.callCount.must.equal(3)
+ replacer.args[0][0].must.equal("")
+ replacer.args[0][1].must.equal(obj)
+ replacer.thisValues[1].must.equal(obj)
+ replacer.args[1][0].must.equal("name")
+ replacer.args[1][1].must.equal("Alice")
+ replacer.thisValues[2].must.equal(obj)
+ replacer.args[2][0].must.equal("self")
+ replacer.args[2][1].must.equal("[Circular ~]")
+ })
+
+ it("must call given decycler and use its output for nested objects",
+ function() {
+ var obj = {}
+ obj.a = obj
+ obj.b = {self: obj}
+
+ var decycle = Sinon.spy(function() { return decycle.callCount })
+ var json = stringify(obj, null, 2, decycle)
+ json.must.eql(jsonify({a: 1, b: {self: 2}}))
+
+ decycle.callCount.must.equal(2)
+ decycle.args[0][0].must.equal("a")
+ decycle.args[0][1].must.equal(obj)
+ decycle.args[1][0].must.equal("self")
+ decycle.args[1][1].must.equal(obj)
+ })
+
+ it("must use decycler's output when it returned null", function() {
+ var obj = {a: "b"}
+ obj.self = obj
+ obj.selves = [obj, obj]
+
+ function decycle() { return null }
+ stringify(obj, null, 2, decycle).must.eql(jsonify({
+ a: "b",
+ self: null,
+ selves: [null, null]
+ }))
+ })
+
+ it("must use decycler's output when it returned undefined", function() {
+ var obj = {a: "b"}
+ obj.self = obj
+ obj.selves = [obj, obj]
+
+ function decycle() {}
+ stringify(obj, null, 2, decycle).must.eql(jsonify({
+ a: "b",
+ selves: [null, null]
+ }))
+ })
+
+ it("must throw given a decycler that returns a cycle", function() {
+ var obj = {}
+ obj.self = obj
+ var err
+ function identity(key, value) { return value }
+ try { stringify(obj, null, 2, identity) } catch (ex) { err = ex }
+ err.must.be.an.instanceof(TypeError)
+ })
+
+ describe(".getSerialize", function() {
+ it("must stringify circular objects", function() {
+ var obj = {a: "b"}
+ obj.circularRef = obj
+ obj.list = [obj, obj]
+
+ var json = JSON.stringify(obj, stringify.getSerialize(), 2)
+ json.must.eql(jsonify({
+ "a": "b",
+ "circularRef": "[Circular ~]",
+ "list": ["[Circular ~]", "[Circular ~]"]
+ }))
+ })
+
+ // This is the behavior as of Mar 3, 2015.
+ // The serializer function keeps state inside the returned function and
+ // so far I'm not sure how to not do that. JSON.stringify's replacer is not
+ // called _after_ serialization.
+ xit("must return a function that could be called twice", function() {
+ var obj = {name: "Alice"}
+ obj.self = obj
+
+ var json
+ var serializer = stringify.getSerialize()
+
+ json = JSON.stringify(obj, serializer, 2)
+ json.must.eql(jsonify({name: "Alice", self: "[Circular ~]"}))
+
+ json = JSON.stringify(obj, serializer, 2)
+ json.must.eql(jsonify({name: "Alice", self: "[Circular ~]"}))
+ })
+ })
+})
+
+function bangString(key, value) {
+ return typeof value == "string" ? value + "!" : value
+}
diff --git a/node_modules/request/node_modules/mime-types/HISTORY.md b/node_modules/request/node_modules/mime-types/HISTORY.md
index aa7cdf169..3f4ebe9a4 100644
--- a/node_modules/request/node_modules/mime-types/HISTORY.md
+++ b/node_modules/request/node_modules/mime-types/HISTORY.md
@@ -1,3 +1,15 @@
+2.0.12 / 2015-05-19
+===================
+
+ * deps: mime-db@~1.10.0
+ - Add new mime types
+
+2.0.11 / 2015-05-05
+===================
+
+ * deps: mime-db@~1.9.1
+ - Add new mime types
+
2.0.10 / 2015-03-13
===================
diff --git a/node_modules/request/node_modules/mime-types/README.md b/node_modules/request/node_modules/mime-types/README.md
index 8fea7ff4c..372749336 100644
--- a/node_modules/request/node_modules/mime-types/README.md
+++ b/node_modules/request/node_modules/mime-types/README.md
@@ -90,13 +90,13 @@ A map of extensions by content-type.
[MIT](LICENSE)
-[npm-image]: https://img.shields.io/npm/v/mime-types.svg?style=flat
+[npm-image]: https://img.shields.io/npm/v/mime-types.svg
[npm-url]: https://npmjs.org/package/mime-types
-[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat
+[node-version-image]: https://img.shields.io/node/v/mime-types.svg
[node-version-url]: http://nodejs.org/download/
-[travis-image]: https://img.shields.io/travis/jshttp/mime-types.svg?style=flat
+[travis-image]: https://img.shields.io/travis/jshttp/mime-types/master.svg
[travis-url]: https://travis-ci.org/jshttp/mime-types
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types.svg?style=flat
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types/master.svg
[coveralls-url]: https://coveralls.io/r/jshttp/mime-types
-[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg?style=flat
+[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg
[downloads-url]: https://npmjs.org/package/mime-types
diff --git a/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md
index 3c6674819..f24590ebd 100644
--- a/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md
+++ b/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md
@@ -1,3 +1,24 @@
+1.10.0 / 2015-05-19
+===================
+
+ * Add `application/vnd.balsamiq.bmpr`
+ * Add `application/vnd.microsoft.portable-executable`
+ * Add `application/x-ns-proxy-autoconfig`
+
+1.9.1 / 2015-04-19
+==================
+
+ * Remove `.json` extension from `application/manifest+json`
+ - This is causing bugs downstream
+
+1.9.0 / 2015-04-19
+==================
+
+ * Add `application/manifest+json`
+ * Add `application/vnd.micro+json`
+ * Add `image/vnd.zbrush.pcx`
+ * Add `image/x-ms-bmp`
+
1.8.0 / 2015-03-13
==================
diff --git a/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md b/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md
index 1dde23490..2c54bb40c 100644
--- a/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md
+++ b/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md
@@ -65,12 +65,12 @@ them with the IANA. The community registration procedure is outlined in
[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types
registered with the IANA are automatically pulled into this library.
-[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg?style=flat
-[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg?style=flat
+[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg
+[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg
[npm-url]: https://npmjs.org/package/mime-db
-[travis-image]: https://img.shields.io/travis/jshttp/mime-db.svg?style=flat
+[travis-image]: https://img.shields.io/travis/jshttp/mime-db/master.svg
[travis-url]: https://travis-ci.org/jshttp/mime-db
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db.svg?style=flat
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db/master.svg
[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master
-[node-image]: https://img.shields.io/node/v/mime-db.svg?style=flat
+[node-image]: https://img.shields.io/node/v/mime-db.svg
[node-url]: http://nodejs.org/download/
diff --git a/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json b/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
index f9f3515b0..d5aa78782 100644
--- a/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
+++ b/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
@@ -513,6 +513,11 @@
"source": "iana",
"extensions": ["mads"]
},
+ "application/manifest+json": {
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["webmanifest"]
+ },
"application/marc": {
"source": "iana",
"extensions": ["mrc"]
@@ -1307,6 +1312,9 @@
"application/vnd.balsamiq.bmml+xml": {
"source": "iana"
},
+ "application/vnd.balsamiq.bmpr": {
+ "source": "iana"
+ },
"application/vnd.bekitzur-stech+json": {
"source": "iana",
"compressible": true
@@ -2374,6 +2382,10 @@
"source": "iana",
"extensions": ["mfm"]
},
+ "application/vnd.micro+json": {
+ "source": "iana",
+ "compressible": true
+ },
"application/vnd.micrografx.flo": {
"source": "iana",
"extensions": ["flo"]
@@ -2382,6 +2394,9 @@
"source": "iana",
"extensions": ["igx"]
},
+ "application/vnd.microsoft.portable-executable": {
+ "source": "iana"
+ },
"application/vnd.miele+json": {
"source": "iana",
"compressible": true
@@ -4366,6 +4381,10 @@
"source": "apache",
"extensions": ["nc","cdf"]
},
+ "application/x-ns-proxy-autoconfig": {
+ "compressible": true,
+ "extensions": ["pac"]
+ },
"application/x-nzb": {
"source": "apache",
"extensions": ["nzb"]
@@ -4554,7 +4573,7 @@
"extensions": ["xhtml","xht"]
},
"application/xhtml-voice+xml": {
- "source": "iana"
+ "source": "apache"
},
"application/xml": {
"source": "iana",
@@ -4855,7 +4874,7 @@
"extensions": ["oga","ogg","spx"]
},
"audio/opus": {
- "source": "apache"
+ "source": "iana"
},
"audio/parityfec": {
"source": "iana"
@@ -5355,6 +5374,9 @@
"source": "iana",
"extensions": ["xif"]
},
+ "image/vnd.zbrush.pcx": {
+ "source": "iana"
+ },
"image/webp": {
"source": "apache",
"extensions": ["webp"]
@@ -5384,6 +5406,10 @@
"source": "apache",
"extensions": ["sid"]
},
+ "image/x-ms-bmp": {
+ "compressible": true,
+ "extensions": ["bmp"]
+ },
"image/x-pcx": {
"source": "apache",
"extensions": ["pcx"]
diff --git a/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json b/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json
index 63b57485c..6ac498a51 100644
--- a/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json
+++ b/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json
@@ -1,7 +1,7 @@
{
"name": "mime-db",
"description": "Media Type Database",
- "version": "1.8.0",
+ "version": "1.10.0",
"contributors": [
{
"name": "Douglas Christopher Wilson",
@@ -30,17 +30,17 @@
],
"repository": {
"type": "git",
- "url": "https://github.com/jshttp/mime-db"
+ "url": "git+https://github.com/jshttp/mime-db.git"
},
"devDependencies": {
- "bluebird": "~2.9.14",
- "co": "~4.4.0",
- "cogent": "1",
- "csv-parse": "0.0.9",
+ "bluebird": "~2.9.20",
+ "co": "4.5.4",
+ "cogent": "1.0.1",
+ "csv-parse": "0.1.1",
"gnode": "0.1.1",
- "istanbul": "0.3.7",
- "mocha": "~1.21.4",
- "raw-body": "~1.3.3",
+ "istanbul": "0.3.9",
+ "mocha": "1.21.5",
+ "raw-body": "2.0.1",
"stream-to-array": "2"
},
"files": [
@@ -61,14 +61,14 @@
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/",
"update": "npm run fetch && npm run build"
},
- "gitHead": "cd5730a475ff03d2ef49fc571d5510a548b63494",
+ "gitHead": "260552f9177fe78986b92699999f81999c7fe43c",
"bugs": {
"url": "https://github.com/jshttp/mime-db/issues"
},
"homepage": "https://github.com/jshttp/mime-db",
- "_id": "mime-db@1.8.0",
- "_shasum": "82a9b385f22b0f5954dec4d445faba0722c4ad25",
- "_from": "mime-db@>=1.8.0 <1.9.0",
+ "_id": "mime-db@1.10.0",
+ "_shasum": "e6308063c758ebd12837874c3d1ea9170766b03b",
+ "_from": "mime-db@>=1.10.0 <1.11.0",
"_npmVersion": "1.4.28",
"_npmUser": {
"name": "dougwilson",
@@ -85,9 +85,10 @@
}
],
"dist": {
- "shasum": "82a9b385f22b0f5954dec4d445faba0722c4ad25",
- "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.8.0.tgz"
+ "shasum": "e6308063c758ebd12837874c3d1ea9170766b03b",
+ "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.10.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.8.0.tgz"
+ "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.10.0.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/mime-types/package.json b/node_modules/request/node_modules/mime-types/package.json
index df71018dc..1db9255bd 100644
--- a/node_modules/request/node_modules/mime-types/package.json
+++ b/node_modules/request/node_modules/mime-types/package.json
@@ -1,7 +1,7 @@
{
"name": "mime-types",
"description": "The ultimate javascript content-type utility.",
- "version": "2.0.10",
+ "version": "2.0.12",
"contributors": [
{
"name": "Douglas Christopher Wilson",
@@ -25,13 +25,13 @@
],
"repository": {
"type": "git",
- "url": "https://github.com/jshttp/mime-types"
+ "url": "git+https://github.com/jshttp/mime-types.git"
},
"dependencies": {
- "mime-db": "~1.8.0"
+ "mime-db": "~1.10.0"
},
"devDependencies": {
- "istanbul": "0.3.7",
+ "istanbul": "0.3.9",
"mocha": "~1.21.5"
},
"files": [
@@ -47,13 +47,13 @@
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js",
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js"
},
- "gitHead": "9d4533a2b3a68af48a7f3ded9f8f525648e7bcc1",
+ "gitHead": "a1e3c4b6bbb6afb615c8a058481d58cb57a4cb95",
"bugs": {
"url": "https://github.com/jshttp/mime-types/issues"
},
"homepage": "https://github.com/jshttp/mime-types",
- "_id": "mime-types@2.0.10",
- "_shasum": "eacd81bb73cab2a77447549a078d4f2018c67b4d",
+ "_id": "mime-types@2.0.12",
+ "_shasum": "87ae9f124e94f8e440c93d1a72d0dccecdb71135",
"_from": "mime-types@>=2.0.1 <2.1.0",
"_npmVersion": "1.4.28",
"_npmUser": {
@@ -75,9 +75,10 @@
}
],
"dist": {
- "shasum": "eacd81bb73cab2a77447549a078d4f2018c67b4d",
- "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.0.10.tgz"
+ "shasum": "87ae9f124e94f8e440c93d1a72d0dccecdb71135",
+ "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.0.12.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.10.tgz"
+ "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.12.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/node-uuid/package.json b/node_modules/request/node_modules/node-uuid/package.json
index ba58c717e..4aa75044a 100644
--- a/node_modules/request/node_modules/node-uuid/package.json
+++ b/node_modules/request/node_modules/node-uuid/package.json
@@ -27,7 +27,7 @@
"main": "./uuid.js",
"repository": {
"type": "git",
- "url": "https://github.com/broofa/node-uuid.git"
+ "url": "git+https://github.com/broofa/node-uuid.git"
},
"version": "1.4.3",
"licenses": [
@@ -60,5 +60,6 @@
"tarball": "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz"
+ "_resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/oauth-sign/index.js b/node_modules/request/node_modules/oauth-sign/index.js
index 63b418c4c..a587541dc 100644
--- a/node_modules/request/node_modules/oauth-sign/index.js
+++ b/node_modules/request/node_modules/oauth-sign/index.js
@@ -30,6 +30,9 @@ function map (obj) {
if (Array.isArray(val))
for (var i = 0; i < val.length; i++)
arr.push([key, val[i]])
+ else if (typeof val === "object")
+ for (var prop in val)
+ arr.push([key + '[' + prop + ']', val[prop]]);
else
arr.push([key, val])
}
diff --git a/node_modules/request/node_modules/oauth-sign/package.json b/node_modules/request/node_modules/oauth-sign/package.json
index bb5b0e11c..074a72bab 100644
--- a/node_modules/request/node_modules/oauth-sign/package.json
+++ b/node_modules/request/node_modules/oauth-sign/package.json
@@ -6,9 +6,10 @@
},
"name": "oauth-sign",
"description": "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.",
- "version": "0.6.0",
+ "version": "0.8.0",
+ "license": "Apache-2.0",
"repository": {
- "url": "https://github.com/mikeal/oauth-sign"
+ "url": "git+https://github.com/mikeal/oauth-sign.git"
},
"main": "index.js",
"dependencies": {},
@@ -20,18 +21,19 @@
"scripts": {
"test": "node test.js"
},
- "gitHead": "f1b5d7714712ab7eec485cca9d18ae95db58aa6b",
+ "gitHead": "e1f2b42ff039901ce977f8e81918767d97d496b5",
"bugs": {
"url": "https://github.com/mikeal/oauth-sign/issues"
},
- "homepage": "https://github.com/mikeal/oauth-sign",
- "_id": "oauth-sign@0.6.0",
- "_shasum": "7dbeae44f6ca454e1f168451d630746735813ce3",
- "_from": "oauth-sign@>=0.6.0 <0.7.0",
- "_npmVersion": "1.4.14",
+ "homepage": "https://github.com/mikeal/oauth-sign#readme",
+ "_id": "oauth-sign@0.8.0",
+ "_shasum": "938fdc875765ba527137d8aec9d178e24debc553",
+ "_from": "oauth-sign@>=0.8.0 <0.9.0",
+ "_npmVersion": "2.10.1",
+ "_nodeVersion": "0.12.4",
"_npmUser": {
- "name": "nylen",
- "email": "jnylen@gmail.com"
+ "name": "simov",
+ "email": "simeonvelichkov@gmail.com"
},
"maintainers": [
{
@@ -41,12 +43,16 @@
{
"name": "nylen",
"email": "jnylen@gmail.com"
+ },
+ {
+ "name": "simov",
+ "email": "simeonvelichkov@gmail.com"
}
],
"dist": {
- "shasum": "7dbeae44f6ca454e1f168451d630746735813ce3",
- "tarball": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz"
+ "shasum": "938fdc875765ba527137d8aec9d178e24debc553",
+ "tarball": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz"
+ "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz"
}
diff --git a/node_modules/request/node_modules/oauth-sign/test.js b/node_modules/request/node_modules/oauth-sign/test.js
index aea800b6f..a8847270d 100644
--- a/node_modules/request/node_modules/oauth-sign/test.js
+++ b/node_modules/request/node_modules/oauth-sign/test.js
@@ -47,6 +47,21 @@ console.log(upsign)
console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=')
assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=')
+// handle objects in params (useful for Wordpress REST API)
+var upsign = hmacsign('POST', 'http://wordpress.com/wp-json',
+ { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g"
+ , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y"
+ , oauth_signature_method: "HMAC-SHA1"
+ , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw"
+ , oauth_timestamp: "1272325550"
+ , oauth_version: "1.0"
+ , filter: { number: "-1" }
+ }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA")
+
+console.log(upsign)
+console.log('YrJFBdwnjuIitGpKrxLUplcuuUQ=')
+assert.equal(upsign, 'YrJFBdwnjuIitGpKrxLUplcuuUQ=')
+
// example in rfc5849
var params = qs.parse('b5=%3D%253D&a3=a&c%40=&a2=r%20b' + '&' + 'c2&a3=2+q')
params.oauth_consumer_key = '9djdj82h48djs9d2'
diff --git a/node_modules/request/node_modules/qs/.eslintignore b/node_modules/request/node_modules/qs/.eslintignore
new file mode 100644
index 000000000..1521c8b76
--- /dev/null
+++ b/node_modules/request/node_modules/qs/.eslintignore
@@ -0,0 +1 @@
+dist
diff --git a/node_modules/request/node_modules/qs/.npmignore b/node_modules/request/node_modules/qs/.npmignore
index 7e1574dc5..2abba8d25 100644
--- a/node_modules/request/node_modules/qs/.npmignore
+++ b/node_modules/request/node_modules/qs/.npmignore
@@ -16,3 +16,4 @@ config.json
coverage.*
lib-cov
complexity.md
+dist
diff --git a/node_modules/request/node_modules/qs/CHANGELOG.md b/node_modules/request/node_modules/qs/CHANGELOG.md
index f5ee8b464..1fadc78ee 100644
--- a/node_modules/request/node_modules/qs/CHANGELOG.md
+++ b/node_modules/request/node_modules/qs/CHANGELOG.md
@@ -1,13 +1,34 @@
-## [**2.3.3**](https://github.com/hapijs/qs/issues?milestone=18&state=open)
-- [**#59**](https://github.com/hapijs/qs/issues/59) make sure array indexes are &gt;= 0, closes #57
+## [**3.1.0**](https://github.com/hapijs/qs/issues?milestone=24&state=open)
+- [**#89**](https://github.com/hapijs/qs/issues/89) Add option to disable "Transform dot notation to bracket notation"
+
+## [**3.0.0**](https://github.com/hapijs/qs/issues?milestone=23&state=closed)
+- [**#77**](https://github.com/hapijs/qs/issues/77) Perf boost
+- [**#60**](https://github.com/hapijs/qs/issues/60) Add explicit option to disable array parsing
+- [**#80**](https://github.com/hapijs/qs/issues/80) qs.parse silently drops properties
+- [**#74**](https://github.com/hapijs/qs/issues/74) Bad parse when turning array into object
+- [**#81**](https://github.com/hapijs/qs/issues/81) Add a `filter` option
+- [**#68**](https://github.com/hapijs/qs/issues/68) Fixed issue with recursion and passing strings into objects.
+- [**#66**](https://github.com/hapijs/qs/issues/66) Add mixed array and object dot notation support Closes: #47
+- [**#76**](https://github.com/hapijs/qs/issues/76) RFC 3986
+- [**#85**](https://github.com/hapijs/qs/issues/85) No equal sign
+- [**#84**](https://github.com/hapijs/qs/issues/84) update license attribute
+
+## [**2.4.1**](https://github.com/hapijs/qs/issues?milestone=20&state=closed)
+- [**#73**](https://github.com/hapijs/qs/issues/73) Property 'hasOwnProperty' of object #<Object> is not a function
+
+## [**2.4.0**](https://github.com/hapijs/qs/issues?milestone=19&state=closed)
+- [**#70**](https://github.com/hapijs/qs/issues/70) Add arrayFormat option
+
+## [**2.3.3**](https://github.com/hapijs/qs/issues?milestone=18&state=closed)
+- [**#59**](https://github.com/hapijs/qs/issues/59) make sure array indexes are >= 0, closes #57
- [**#58**](https://github.com/hapijs/qs/issues/58) make qs usable for browser loader
## [**2.3.2**](https://github.com/hapijs/qs/issues?milestone=17&state=closed)
- [**#55**](https://github.com/hapijs/qs/issues/55) allow merging a string into an object
## [**2.3.1**](https://github.com/hapijs/qs/issues?milestone=16&state=closed)
-- [**#52**](https://github.com/hapijs/qs/issues/52) Return &quot;undefined&quot; and &quot;false&quot; instead of throwing &quot;TypeError&quot;.
+- [**#52**](https://github.com/hapijs/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError".
## [**2.3.0**](https://github.com/hapijs/qs/issues?milestone=15&state=closed)
- [**#50**](https://github.com/hapijs/qs/issues/50) add option to omit array indices, closes #46
@@ -34,9 +55,9 @@
- [**#31**](https://github.com/hapijs/qs/issues/31) qs.parse stackoverflow on circular objects
## [**2.2.0**](https://github.com/hapijs/qs/issues?milestone=9&state=closed)
-- [**#26**](https://github.com/hapijs/qs/issues/26) Don&#39;t use Buffer global if it&#39;s not present
+- [**#26**](https://github.com/hapijs/qs/issues/26) Don't use Buffer global if it's not present
- [**#30**](https://github.com/hapijs/qs/issues/30) Bug when merging non-object values into arrays
-- [**#29**](https://github.com/hapijs/qs/issues/29) Don&#39;t call Utils.clone at the top of Utils.merge
+- [**#29**](https://github.com/hapijs/qs/issues/29) Don't call Utils.clone at the top of Utils.merge
- [**#23**](https://github.com/hapijs/qs/issues/23) Ability to not limit parameters?
## [**2.1.0**](https://github.com/hapijs/qs/issues?milestone=8&state=closed)
@@ -48,7 +69,7 @@
- [**#21**](https://github.com/hapijs/qs/issues/21) make all limits optional, for #18, for #20
## [**1.2.2**](https://github.com/hapijs/qs/issues?milestone=6&state=closed)
-- [**#19**](https://github.com/hapijs/qs/issues/19) Don&#39;t overwrite null values
+- [**#19**](https://github.com/hapijs/qs/issues/19) Don't overwrite null values
## [**1.2.1**](https://github.com/hapijs/qs/issues?milestone=5&state=closed)
- [**#16**](https://github.com/hapijs/qs/issues/16) ignore non-string delimiters
@@ -65,4 +86,3 @@
## [**1.0.2**](https://github.com/hapijs/qs/issues?milestone=2&state=closed)
- [**#5**](https://github.com/hapijs/qs/issues/5) array holes incorrectly copied into object on large index
-
diff --git a/node_modules/request/node_modules/qs/LICENSE b/node_modules/request/node_modules/qs/LICENSE
index d4569487a..d4569487a 100755..100644
--- a/node_modules/request/node_modules/qs/LICENSE
+++ b/node_modules/request/node_modules/qs/LICENSE
diff --git a/node_modules/request/node_modules/qs/Readme.md b/node_modules/request/node_modules/qs/Readme.md
index 2d7e7f5a0..0c72aba5d 100755..100644
--- a/node_modules/request/node_modules/qs/Readme.md
+++ b/node_modules/request/node_modules/qs/Readme.md
@@ -23,7 +23,7 @@ var str = Qs.stringify(obj); // 'a=c'
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 `[]`.
+**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`, or prefixing the sub-key with a dot `.`.
For example, the string `'foo[bar]=baz'` converts to:
```javascript
@@ -34,6 +34,13 @@ For example, the string `'foo[bar]=baz'` converts to:
}
```
+The parsed value is returned as a plain object, created via `Object.create(null)` and as such you should be aware that prototype methods do not exist on it and a user may set those names to whatever value they like:
+
+```javascript
+Qs.parse('a.hasOwnProperty=b');
+// { a: { hasOwnProperty: 'b' } }
+```
+
URI encoded strings work too:
```javascript
@@ -153,7 +160,12 @@ Qs.parse('a[1]=b', { arrayLimit: 0 });
// { a: { '1': 'b' } }
```
-To disable array parsing entirely, set `arrayLimit` to `-1`.
+To disable array parsing entirely, set `parseArrays` to `false`.
+
+```javascript
+Qs.parse('a[]=b', { parseArrays: false });
+// { a: { '0': 'b' } }
+```
If you mix notations, **qs** will merge the two items into an object:
@@ -231,3 +243,61 @@ The delimiter may be overridden with stringify as well:
Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' });
// 'a=b;c=d'
```
+
+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
+Qs.stringify({ a: null, b: '' });
+// 'a=&b='
+```
+
+Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.
+
+```javascript
+Qs.parse('a&b=')
+// { 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
+Qs.stringify({ a: null, b: '' }, { strictNullHandling: true });
+// 'a&b='
+```
+
+To parse values without `=` back to `null` use the `strictNullHandling` flag:
+
+```javascript
+Qs.parse('a&b=', { strictNullHandling: true });
+// { a: null, b: '' }
+
+```
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 000000000..ffd0641d8
--- /dev/null
+++ b/node_modules/request/node_modules/qs/bower.json
@@ -0,0 +1,22 @@
+{
+ "name": "qs",
+ "main": "dist/qs.js",
+ "version": "3.0.0",
+ "homepage": "https://github.com/hapijs/qs",
+ "authors": [
+ "Nathan LaFreniere <quitlahok@gmail.com>"
+ ],
+ "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/lib/index.js b/node_modules/request/node_modules/qs/lib/index.js
index 0e094933d..0e094933d 100755..100644
--- a/node_modules/request/node_modules/qs/lib/index.js
+++ b/node_modules/request/node_modules/qs/lib/index.js
diff --git a/node_modules/request/node_modules/qs/lib/parse.js b/node_modules/request/node_modules/qs/lib/parse.js
index 55a0613c8..1a1e205e3 100755..100644
--- a/node_modules/request/node_modules/qs/lib/parse.js
+++ b/node_modules/request/node_modules/qs/lib/parse.js
@@ -9,7 +9,8 @@ var internals = {
delimiter: '&',
depth: 5,
arrayLimit: 20,
- parameterLimit: 1000
+ parameterLimit: 1000,
+ strictNullHandling: false
};
@@ -24,16 +25,16 @@ internals.parseValues = function (str, options) {
if (pos === -1) {
obj[Utils.decode(part)] = '';
+
+ if (options.strictNullHandling) {
+ obj[Utils.decode(part)] = null;
+ }
}
else {
var key = Utils.decode(part.slice(0, pos));
var val = Utils.decode(part.slice(pos + 1));
- if (Object.prototype.hasOwnProperty(key)) {
- continue;
- }
-
- if (!obj.hasOwnProperty(key)) {
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
obj[key] = val;
}
else {
@@ -54,12 +55,13 @@ internals.parseObject = function (chain, val, options) {
var root = chain.shift();
- var obj = {};
+ var obj;
if (root === '[]') {
obj = [];
obj = obj.concat(internals.parseObject(chain, val, options));
}
else {
+ obj = Object.create(null);
var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
var index = parseInt(cleanRoot, 10);
var indexString = '' + index;
@@ -67,7 +69,8 @@ internals.parseObject = function (chain, val, options) {
root !== cleanRoot &&
indexString === cleanRoot &&
index >= 0 &&
- index <= options.arrayLimit) {
+ (options.parseArrays &&
+ index <= options.arrayLimit)) {
obj = [];
obj[index] = internals.parseObject(chain, val, options);
@@ -87,6 +90,12 @@ internals.parseKeys = function (key, val, options) {
return;
}
+ // Transform dot notation to bracket notation
+
+ if (options.allowDots) {
+ key = key.replace(/\.([^\.\[]+)/g, '[$1]');
+ }
+
// The regex chunks
var parent = /^([^\[\]]*)/;
@@ -96,12 +105,6 @@ internals.parseKeys = function (key, val, options) {
var segment = parent.exec(key);
- // Don't allow them to overwrite object prototype properties
-
- if (Object.prototype.hasOwnProperty(segment[1])) {
- return;
- }
-
// Stash the parent if it exists
var keys = [];
@@ -115,9 +118,7 @@ internals.parseKeys = function (key, val, options) {
while ((segment = child.exec(key)) !== null && i < options.depth) {
++i;
- if (!Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
- keys.push(segment[1]);
- }
+ keys.push(segment[1]);
}
// If there's a remainder, just add whatever is left
@@ -136,17 +137,21 @@ module.exports = function (str, options) {
str === null ||
typeof str === 'undefined') {
- return {};
+ return Object.create(null);
}
options = options || {};
options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter;
options.depth = typeof options.depth === 'number' ? options.depth : internals.depth;
options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit;
+ options.parseArrays = options.parseArrays !== false;
+ options.allowDots = options.allowDots !== false;
options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit;
+ options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
+
var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str;
- var obj = {};
+ var obj = Object.create(null);
// Iterate over the keys and setup the new object
diff --git a/node_modules/request/node_modules/qs/lib/stringify.js b/node_modules/request/node_modules/qs/lib/stringify.js
index 3ce6cc19d..7414284c5 100755..100644
--- a/node_modules/request/node_modules/qs/lib/stringify.js
+++ b/node_modules/request/node_modules/qs/lib/stringify.js
@@ -9,27 +9,38 @@ var internals = {
delimiter: '&',
arrayPrefixGenerators: {
brackets: function (prefix, key) {
+
return prefix + '[]';
},
indices: function (prefix, key) {
+
return prefix + '[' + key + ']';
},
repeat: function (prefix, key) {
+
return prefix;
}
- }
+ },
+ strictNullHandling: false
};
-internals.stringify = function (obj, prefix, generateArrayPrefix) {
+internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, filter) {
- if (Utils.isBuffer(obj)) {
+ if (typeof filter === 'function') {
+ obj = filter(prefix, obj);
+ }
+ else if (Utils.isBuffer(obj)) {
obj = obj.toString();
}
else if (obj instanceof Date) {
obj = obj.toISOString();
}
else if (obj === null) {
+ if (strictNullHandling) {
+ return Utils.encode(prefix);
+ }
+
obj = '';
}
@@ -37,7 +48,7 @@ internals.stringify = function (obj, prefix, generateArrayPrefix) {
typeof obj === 'number' ||
typeof obj === 'boolean') {
- return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)];
+ return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
}
var values = [];
@@ -46,14 +57,15 @@ internals.stringify = function (obj, prefix, generateArrayPrefix) {
return values;
}
- var objKeys = Object.keys(obj);
+ var objKeys = Array.isArray(filter) ? filter : Object.keys(obj);
for (var i = 0, il = objKeys.length; i < il; ++i) {
var key = objKeys[i];
+
if (Array.isArray(obj)) {
- values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix));
+ values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, filter));
}
else {
- values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix));
+ values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, filter));
}
}
@@ -65,6 +77,16 @@ module.exports = function (obj, options) {
options = options || {};
var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
+ var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
+ var objKeys;
+ var filter;
+ if (typeof options.filter === 'function') {
+ filter = options.filter;
+ obj = filter('', obj);
+ }
+ else if (Array.isArray(options.filter)) {
+ objKeys = filter = options.filter;
+ }
var keys = [];
@@ -87,10 +109,12 @@ module.exports = function (obj, options) {
var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
- var objKeys = Object.keys(obj);
+ if (!objKeys) {
+ objKeys = Object.keys(obj);
+ }
for (var i = 0, il = objKeys.length; i < il; ++i) {
var key = objKeys[i];
- keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix));
+ keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, filter));
}
return keys.join(delimiter);
diff --git a/node_modules/request/node_modules/qs/lib/utils.js b/node_modules/request/node_modules/qs/lib/utils.js
index 5240bd5b0..ec93afcd2 100755..100644
--- a/node_modules/request/node_modules/qs/lib/utils.js
+++ b/node_modules/request/node_modules/qs/lib/utils.js
@@ -4,11 +4,15 @@
// Declare internals
var internals = {};
+internals.hexTable = new Array(256);
+for (var i = 0; i < 256; ++i) {
+ internals.hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
+}
exports.arrayToObject = function (source) {
- var obj = {};
+ var obj = Object.create(null);
for (var i = 0, il = source.length; i < il; ++i) {
if (typeof source[i] !== 'undefined') {
@@ -30,9 +34,12 @@ exports.merge = function (target, source) {
if (Array.isArray(target)) {
target.push(source);
}
- else {
+ else if (typeof target === 'object') {
target[source] = true;
}
+ else {
+ target = [target, source];
+ }
return target;
}
@@ -74,6 +81,56 @@ exports.decode = function (str) {
}
};
+exports.encode = function (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;
+ }
+
+ if (typeof str !== 'string') {
+ str = '' + str;
+ }
+
+ var out = '';
+ for (var i = 0, il = str.length; i < il; ++i) {
+ var c = str.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 += str[i];
+ continue;
+ }
+
+ if (c < 0x80) {
+ out += internals.hexTable[c];
+ continue;
+ }
+
+ if (c < 0x800) {
+ out += internals.hexTable[0xC0 | (c >> 6)] + internals.hexTable[0x80 | (c & 0x3F)];
+ continue;
+ }
+
+ if (c < 0xD800 || c >= 0xE000) {
+ out += internals.hexTable[0xE0 | (c >> 12)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)];
+ continue;
+ }
+
+ ++i;
+ c = 0x10000 + (((c & 0x3FF) << 10) | (str.charCodeAt(i) & 0x3FF));
+ out += internals.hexTable[0xF0 | (c >> 18)] + internals.hexTable[0x80 | ((c >> 12) & 0x3F)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)];
+ }
+
+ return out;
+};
exports.compact = function (obj, refs) {
@@ -114,6 +171,7 @@ exports.compact = function (obj, refs) {
exports.isRegExp = function (obj) {
+
return Object.prototype.toString.call(obj) === '[object RegExp]';
};
@@ -127,6 +185,6 @@ exports.isBuffer = function (obj) {
}
return !!(obj.constructor &&
- obj.constructor.isBuffer &&
- obj.constructor.isBuffer(obj));
+ obj.constructor.isBuffer &&
+ obj.constructor.isBuffer(obj));
};
diff --git a/node_modules/request/node_modules/qs/package.json b/node_modules/request/node_modules/qs/package.json
index 980ada8b4..257c718ae 100644
--- a/node_modules/request/node_modules/qs/package.json
+++ b/node_modules/request/node_modules/qs/package.json
@@ -1,44 +1,45 @@
{
"name": "qs",
- "version": "2.4.1",
+ "version": "3.1.0",
"description": "A querystring parser that supports nesting and arrays, with a depth limit",
"homepage": "https://github.com/hapijs/qs",
"main": "index.js",
"dependencies": {},
"devDependencies": {
+ "browserify": "^10.2.1",
"code": "1.x.x",
"lab": "5.x.x"
},
"scripts": {
- "test": "make test-cov"
+ "test": "make test-cov",
+ "dist": "browserify --standalone Qs index.js > dist/qs.js"
},
"repository": {
"type": "git",
- "url": "https://github.com/hapijs/qs.git"
+ "url": "git+https://github.com/hapijs/qs.git"
},
"keywords": [
"querystring",
"qs"
],
- "licenses": [
- {
- "type": "BSD",
- "url": "http://github.com/hapijs/qs/raw/master/LICENSE"
- }
- ],
- "gitHead": "58c6540418954867822c1af3e45fb4c26708b07e",
+ "license": "BSD-3-Clause",
+ "gitHead": "e53b1b242a55f886531954ebdd78b3b20efadaf0",
"bugs": {
"url": "https://github.com/hapijs/qs/issues"
},
- "_id": "qs@2.4.1",
- "_shasum": "68cbaea971013426a80c1404fad6b1a6b1175245",
- "_from": "qs@>=2.4.0 <2.5.0",
- "_npmVersion": "2.6.1",
- "_nodeVersion": "0.10.36",
+ "_id": "qs@3.1.0",
+ "_shasum": "d0e9ae745233a12dc43fb4f3055bba446261153c",
+ "_from": "qs@>=3.1.0 <3.2.0",
+ "_npmVersion": "2.9.0",
+ "_nodeVersion": "0.12.2",
"_npmUser": {
"name": "nlf",
"email": "quitlahok@gmail.com"
},
+ "dist": {
+ "shasum": "d0e9ae745233a12dc43fb4f3055bba446261153c",
+ "tarball": "http://registry.npmjs.org/qs/-/qs-3.1.0.tgz"
+ },
"maintainers": [
{
"name": "nlf",
@@ -49,10 +50,6 @@
"email": "eran@hueniverse.com"
}
],
- "dist": {
- "shasum": "68cbaea971013426a80c1404fad6b1a6b1175245",
- "tarball": "http://registry.npmjs.org/qs/-/qs-2.4.1.tgz"
- },
"directories": {},
- "_resolved": "https://registry.npmjs.org/qs/-/qs-2.4.1.tgz"
+ "_resolved": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz"
}
diff --git a/node_modules/request/node_modules/qs/test/parse.js b/node_modules/request/node_modules/qs/test/parse.js
index f06788a89..9afbf35f0 100755..100644
--- a/node_modules/request/node_modules/qs/test/parse.js
+++ b/node_modules/request/node_modules/qs/test/parse.js
@@ -23,174 +23,194 @@ describe('parse()', function () {
it('parses a simple string', function (done) {
- expect(Qs.parse('0=foo')).to.deep.equal({ '0': 'foo' });
- expect(Qs.parse('foo=c++')).to.deep.equal({ foo: 'c ' });
- expect(Qs.parse('a[>=]=23')).to.deep.equal({ a: { '>=': '23' } });
- expect(Qs.parse('a[<=>]==23')).to.deep.equal({ a: { '<=>': '=23' } });
- expect(Qs.parse('a[==]=23')).to.deep.equal({ a: { '==': '23' } });
- expect(Qs.parse('foo')).to.deep.equal({ foo: '' });
- expect(Qs.parse('foo=bar')).to.deep.equal({ foo: 'bar' });
- expect(Qs.parse(' foo = bar = baz ')).to.deep.equal({ ' foo ': ' bar = baz ' });
- expect(Qs.parse('foo=bar=baz')).to.deep.equal({ foo: 'bar=baz' });
- expect(Qs.parse('foo=bar&bar=baz')).to.deep.equal({ foo: 'bar', bar: 'baz' });
- expect(Qs.parse('foo=bar&baz')).to.deep.equal({ foo: 'bar', baz: '' });
+ expect(Qs.parse('0=foo')).to.deep.equal({ '0': 'foo' }, { prototype: false });
+ expect(Qs.parse('foo=c++')).to.deep.equal({ foo: 'c ' }, { prototype: false });
+ expect(Qs.parse('a[>=]=23')).to.deep.equal({ a: { '>=': '23' } }, { prototype: false });
+ expect(Qs.parse('a[<=>]==23')).to.deep.equal({ a: { '<=>': '=23' } }, { prototype: false });
+ expect(Qs.parse('a[==]=23')).to.deep.equal({ a: { '==': '23' } }, { prototype: false });
+ expect(Qs.parse('foo', {strictNullHandling: true})).to.deep.equal({ foo: null }, { prototype: false });
+ expect(Qs.parse('foo' )).to.deep.equal({ foo: '' }, { prototype: false });
+ expect(Qs.parse('foo=')).to.deep.equal({ foo: '' }, { prototype: false });
+ expect(Qs.parse('foo=bar')).to.deep.equal({ foo: 'bar' }, { prototype: false });
+ expect(Qs.parse(' foo = bar = baz ')).to.deep.equal({ ' foo ': ' bar = baz ' }, { prototype: false });
+ expect(Qs.parse('foo=bar=baz')).to.deep.equal({ foo: 'bar=baz' }, { prototype: false });
+ expect(Qs.parse('foo=bar&bar=baz')).to.deep.equal({ foo: 'bar', bar: 'baz' }, { prototype: false });
+ expect(Qs.parse('foo2=bar2&baz2=')).to.deep.equal({ foo2: 'bar2', baz2: '' }, { prototype: false });
+ expect(Qs.parse('foo=bar&baz', {strictNullHandling: true})).to.deep.equal({ foo: 'bar', baz: null }, { prototype: false });
+ expect(Qs.parse('foo=bar&baz')).to.deep.equal({ foo: 'bar', baz: '' }, { prototype: false });
expect(Qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')).to.deep.equal({
cht: 'p3',
chd: 't:60,40',
chs: '250x100',
chl: 'Hello|World'
- });
+ }, { prototype: false });
+ done();
+ });
+
+ it('allows disabling dot notation', function (done) {
+
+ expect(Qs.parse('a.b=c')).to.deep.equal({ a: { b: 'c' } }, { prototype: false });
+ expect(Qs.parse('a.b=c', { allowDots: false })).to.deep.equal({ 'a.b': 'c' }, { prototype: false });
done();
});
it('parses a single nested string', function (done) {
- expect(Qs.parse('a[b]=c')).to.deep.equal({ a: { b: 'c' } });
+ expect(Qs.parse('a[b]=c')).to.deep.equal({ a: { b: 'c' } }, { prototype: false });
done();
});
it('parses a double nested string', function (done) {
- expect(Qs.parse('a[b][c]=d')).to.deep.equal({ a: { b: { c: 'd' } } });
+ expect(Qs.parse('a[b][c]=d')).to.deep.equal({ a: { b: { c: 'd' } } }, { prototype: false });
done();
});
it('defaults to a depth of 5', function (done) {
- expect(Qs.parse('a[b][c][d][e][f][g][h]=i')).to.deep.equal({ a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } });
+ expect(Qs.parse('a[b][c][d][e][f][g][h]=i')).to.deep.equal({ a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, { prototype: false });
done();
});
it('only parses one level when depth = 1', function (done) {
- expect(Qs.parse('a[b][c]=d', { depth: 1 })).to.deep.equal({ a: { b: { '[c]': 'd' } } });
- expect(Qs.parse('a[b][c][d]=e', { depth: 1 })).to.deep.equal({ a: { b: { '[c][d]': 'e' } } });
+ expect(Qs.parse('a[b][c]=d', { depth: 1 })).to.deep.equal({ a: { b: { '[c]': 'd' } } }, { prototype: false });
+ expect(Qs.parse('a[b][c][d]=e', { depth: 1 })).to.deep.equal({ a: { b: { '[c][d]': 'e' } } }, { prototype: false });
done();
});
it('parses a simple array', function (done) {
- expect(Qs.parse('a=b&a=c')).to.deep.equal({ a: ['b', 'c'] });
+ expect(Qs.parse('a=b&a=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
done();
});
it('parses an explicit array', function (done) {
- expect(Qs.parse('a[]=b')).to.deep.equal({ a: ['b'] });
- expect(Qs.parse('a[]=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] });
- expect(Qs.parse('a[]=b&a[]=c&a[]=d')).to.deep.equal({ a: ['b', 'c', 'd'] });
+ expect(Qs.parse('a[]=b')).to.deep.equal({ a: ['b'] }, { prototype: false });
+ expect(Qs.parse('a[]=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
+ expect(Qs.parse('a[]=b&a[]=c&a[]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }, { prototype: false });
done();
});
it('parses a mix of simple and explicit arrays', function (done) {
- expect(Qs.parse('a=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] });
- expect(Qs.parse('a[]=b&a=c')).to.deep.equal({ a: ['b', 'c'] });
- expect(Qs.parse('a[0]=b&a=c')).to.deep.equal({ a: ['b', 'c'] });
- expect(Qs.parse('a=b&a[0]=c')).to.deep.equal({ a: ['b', 'c'] });
- expect(Qs.parse('a[1]=b&a=c')).to.deep.equal({ a: ['b', 'c'] });
- expect(Qs.parse('a=b&a[1]=c')).to.deep.equal({ a: ['b', 'c'] });
+ expect(Qs.parse('a=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
+ expect(Qs.parse('a[]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
+ expect(Qs.parse('a[0]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
+ expect(Qs.parse('a=b&a[0]=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
+ expect(Qs.parse('a[1]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
+ expect(Qs.parse('a=b&a[1]=c')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
done();
});
it('parses a nested array', function (done) {
- expect(Qs.parse('a[b][]=c&a[b][]=d')).to.deep.equal({ a: { b: ['c', 'd'] } });
- expect(Qs.parse('a[>=]=25')).to.deep.equal({ a: { '>=': '25' } });
+ expect(Qs.parse('a[b][]=c&a[b][]=d')).to.deep.equal({ a: { b: ['c', 'd'] } }, { prototype: false });
+ expect(Qs.parse('a[>=]=25')).to.deep.equal({ a: { '>=': '25' } }, { prototype: false });
done();
});
it('allows to specify array indices', function (done) {
- expect(Qs.parse('a[1]=c&a[0]=b&a[2]=d')).to.deep.equal({ a: ['b', 'c', 'd'] });
- expect(Qs.parse('a[1]=c&a[0]=b')).to.deep.equal({ a: ['b', 'c'] });
- expect(Qs.parse('a[1]=c')).to.deep.equal({ a: ['c'] });
+ expect(Qs.parse('a[1]=c&a[0]=b&a[2]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }, { prototype: false });
+ expect(Qs.parse('a[1]=c&a[0]=b')).to.deep.equal({ a: ['b', 'c'] }, { prototype: false });
+ expect(Qs.parse('a[1]=c')).to.deep.equal({ a: ['c'] }, { prototype: false });
done();
});
it('limits specific array indices to 20', function (done) {
- expect(Qs.parse('a[20]=a')).to.deep.equal({ a: ['a'] });
- expect(Qs.parse('a[21]=a')).to.deep.equal({ a: { '21': 'a' } });
+ expect(Qs.parse('a[20]=a')).to.deep.equal({ a: ['a'] }, { prototype: false });
+ expect(Qs.parse('a[21]=a')).to.deep.equal({ a: { '21': 'a' } }, { prototype: false });
done();
});
it('supports keys that begin with a number', function (done) {
- expect(Qs.parse('a[12b]=c')).to.deep.equal({ a: { '12b': 'c' } });
+ expect(Qs.parse('a[12b]=c')).to.deep.equal({ a: { '12b': 'c' } }, { prototype: false });
done();
});
it('supports encoded = signs', function (done) {
- expect(Qs.parse('he%3Dllo=th%3Dere')).to.deep.equal({ 'he=llo': 'th=ere' });
+ expect(Qs.parse('he%3Dllo=th%3Dere')).to.deep.equal({ 'he=llo': 'th=ere' }, { prototype: false });
done();
});
it('is ok with url encoded strings', function (done) {
- expect(Qs.parse('a[b%20c]=d')).to.deep.equal({ a: { 'b c': 'd' } });
- expect(Qs.parse('a[b]=c%20d')).to.deep.equal({ a: { b: 'c d' } });
+ expect(Qs.parse('a[b%20c]=d')).to.deep.equal({ a: { 'b c': 'd' } }, { prototype: false });
+ expect(Qs.parse('a[b]=c%20d')).to.deep.equal({ a: { b: 'c d' } }, { prototype: false });
done();
});
it('allows brackets in the value', function (done) {
- expect(Qs.parse('pets=["tobi"]')).to.deep.equal({ pets: '["tobi"]' });
- expect(Qs.parse('operators=[">=", "<="]')).to.deep.equal({ operators: '[">=", "<="]' });
+ expect(Qs.parse('pets=["tobi"]')).to.deep.equal({ pets: '["tobi"]' }, { prototype: false });
+ expect(Qs.parse('operators=[">=", "<="]')).to.deep.equal({ operators: '[">=", "<="]' }, { prototype: false });
done();
});
it('allows empty values', function (done) {
- expect(Qs.parse('')).to.deep.equal({});
- expect(Qs.parse(null)).to.deep.equal({});
- expect(Qs.parse(undefined)).to.deep.equal({});
+ expect(Qs.parse('')).to.deep.equal({}, { prototype: false });
+ expect(Qs.parse(null)).to.deep.equal({}, { prototype: false });
+ expect(Qs.parse(undefined)).to.deep.equal({}, { prototype: false });
done();
});
it('transforms arrays to objects', function (done) {
- expect(Qs.parse('foo[0]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } });
- expect(Qs.parse('foo[bad]=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } });
- expect(Qs.parse('foo[bad]=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } });
- expect(Qs.parse('foo[]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } });
- expect(Qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } });
- expect(Qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb')).to.deep.equal({foo: [ {a: 'a', b: 'b'}, {a: 'aa', b: 'bb'} ]});
+ expect(Qs.parse('foo[0]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }, { prototype: false });
+ expect(Qs.parse('foo[bad]=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }, { prototype: false });
+ expect(Qs.parse('foo[bad]=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }, { prototype: false });
+ expect(Qs.parse('foo[]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }, { prototype: false });
+ expect(Qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }, { prototype: false });
+ expect(Qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb')).to.deep.equal({foo: [ {a: 'a', b: 'b'}, {a: 'aa', b: 'bb'} ]}, { prototype: false });
+ expect(Qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c')).to.deep.equal({ a: { '0': 'b', t: 'u', hasOwnProperty: 'c' } }, { prototype: false });
+ expect(Qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y')).to.deep.equal({ a: { '0': 'b', hasOwnProperty: 'c', x: 'y' } }, { prototype: false });
done();
});
- it('can add keys to objects', function (done) {
+ it('transforms arrays to objects (dot notation)', function (done) {
- expect(Qs.parse('a[b]=c&a=d')).to.deep.equal({ a: { b: 'c', d: true } });
+ expect(Qs.parse('foo[0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [ { baz: 'bar'} ], fool: { bad: 'baz' } }, { prototype: false });
+ expect(Qs.parse('foo[0].baz=bar&fool.bad.boo=baz')).to.deep.equal({ foo: [ { baz: 'bar'} ], fool: { bad: { boo: 'baz' } } }, { prototype: false });
+ expect(Qs.parse('foo[0][0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [[ { baz: 'bar'} ]], fool: { bad: 'baz' } }, { prototype: false });
+ expect(Qs.parse('foo[0].baz[0]=15&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15'], bar: '2' }] }, { prototype: false });
+ expect(Qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15', '16'], bar: '2' }] }, { prototype: false });
+ expect(Qs.parse('foo.bad=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }, { prototype: false });
+ expect(Qs.parse('foo.bad=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }, { prototype: false });
+ expect(Qs.parse('foo[]=bar&foo.bad=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }, { prototype: false });
+ expect(Qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }, { prototype: false });
+ expect(Qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb')).to.deep.equal({foo: [ {a: 'a', b: 'b'}, {a: 'aa', b: 'bb'} ]}, { prototype: false });
done();
});
- it('correctly prunes undefined values when converting an array to an object', function (done) {
+ it('can add keys to objects', function (done) {
- expect(Qs.parse('a[2]=b&a[99999999]=c')).to.deep.equal({ a: { '2': 'b', '99999999': 'c' } });
+ expect(Qs.parse('a[b]=c&a=d')).to.deep.equal({ a: { b: 'c', d: true } }, { prototype: false });
done();
});
- it('supports malformed uri characters', function (done) {
+ it('correctly prunes undefined values when converting an array to an object', function (done) {
- expect(Qs.parse('{%:%}')).to.deep.equal({ '{%:%}': '' });
- expect(Qs.parse('foo=%:%}')).to.deep.equal({ foo: '%:%}' });
+ expect(Qs.parse('a[2]=b&a[99999999]=c')).to.deep.equal({ a: { '2': 'b', '99999999': 'c' } }, { prototype: false });
done();
});
- it('doesn\'t produce empty keys', function (done) {
+ it('supports malformed uri characters', function (done) {
- expect(Qs.parse('_r=1&')).to.deep.equal({ '_r': '1' });
+ expect(Qs.parse('{%:%}', {strictNullHandling: true})).to.deep.equal({ '{%:%}': null }, { prototype: false });
+ expect(Qs.parse('{%:%}=')).to.deep.equal({ '{%:%}': '' }, { prototype: false });
+ expect(Qs.parse('foo=%:%}')).to.deep.equal({ foo: '%:%}' }, { prototype: false });
done();
});
- it('cannot override prototypes', function (done) {
+ it('doesn\'t produce empty keys', function (done) {
- var obj = Qs.parse('hasOwnProperty=bad&toString=bad&bad[toString]=bad&constructor=bad');
- expect(typeof obj.toString).to.equal('function');
- expect(typeof obj.bad.toString).to.equal('function');
- expect(typeof obj.constructor).to.equal('function');
+ expect(Qs.parse('_r=1&')).to.deep.equal({ '_r': '1' }, { prototype: false });
done();
});
@@ -204,43 +224,45 @@ describe('parse()', function () {
it('parses arrays of objects', function (done) {
- expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] });
- expect(Qs.parse('a[0][b]=c')).to.deep.equal({ a: [{ b: 'c' }] });
+ expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }, { prototype: false });
+ expect(Qs.parse('a[0][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }, { prototype: false });
done();
});
it('allows for empty strings in arrays', function (done) {
- expect(Qs.parse('a[]=b&a[]=&a[]=c')).to.deep.equal({ a: ['b', '', 'c'] });
- expect(Qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]=')).to.deep.equal({ a: ['b', '', 'c', ''] });
- expect(Qs.parse('a[]=&a[]=b&a[]=c')).to.deep.equal({ a: ['', 'b', 'c'] });
+ expect(Qs.parse('a[]=b&a[]=&a[]=c')).to.deep.equal({ a: ['b', '', 'c'] }, { prototype: false });
+ expect(Qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', {strictNullHandling: true})).to.deep.equal({ a: ['b', null, 'c', ''] }, { prototype: false });
+ expect(Qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', {strictNullHandling: true})).to.deep.equal({ a: ['b', '', 'c', null] }, { prototype: false });
+ expect(Qs.parse('a[]=&a[]=b&a[]=c')).to.deep.equal({ a: ['', 'b', 'c'] }, { prototype: false });
done();
});
it('compacts sparse arrays', function (done) {
- expect(Qs.parse('a[10]=1&a[2]=2')).to.deep.equal({ a: ['2', '1'] });
+ expect(Qs.parse('a[10]=1&a[2]=2')).to.deep.equal({ a: ['2', '1'] }, { prototype: false });
done();
});
it('parses semi-parsed strings', function (done) {
- expect(Qs.parse({ 'a[b]': 'c' })).to.deep.equal({ a: { b: 'c' } });
- expect(Qs.parse({ 'a[b]': 'c', 'a[d]': 'e' })).to.deep.equal({ a: { b: 'c', d: 'e' } });
+ expect(Qs.parse({ 'a[b]': 'c' })).to.deep.equal({ a: { b: 'c' } }, { prototype: false });
+ expect(Qs.parse({ 'a[b]': 'c', 'a[d]': 'e' })).to.deep.equal({ a: { b: 'c', d: 'e' } }, { prototype: false });
done();
});
it('parses buffers correctly', function (done) {
var b = new Buffer('test');
- expect(Qs.parse({ a: b })).to.deep.equal({ a: b });
+ expect(Qs.parse({ a: b })).to.deep.equal({ a: b }, { prototype: false });
done();
});
it('continues parsing when no parent is found', function (done) {
- expect(Qs.parse('[]&a=b')).to.deep.equal({ '0': '', a: 'b' });
- expect(Qs.parse('[foo]=bar')).to.deep.equal({ foo: 'bar' });
+ expect(Qs.parse('[]=&a=b')).to.deep.equal({ '0': '', a: 'b' }, { prototype: false });
+ expect(Qs.parse('[]&a=b', {strictNullHandling: true})).to.deep.equal({ '0': null, a: 'b' }, { prototype: false });
+ expect(Qs.parse('[foo]=bar')).to.deep.equal({ foo: 'bar' }, { prototype: false });
done();
});
@@ -264,9 +286,9 @@ describe('parse()', function () {
Object.prototype.crash = '';
Array.prototype.crash = '';
expect(Qs.parse.bind(null, 'a=b')).to.not.throw();
- expect(Qs.parse('a=b')).to.deep.equal({ a: 'b' });
+ expect(Qs.parse('a=b')).to.deep.equal({ a: 'b' }, { prototype: false });
expect(Qs.parse.bind(null, 'a[][b]=c')).to.not.throw();
- expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] });
+ expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }, { prototype: false });
delete Object.prototype.crash;
delete Array.prototype.crash;
done();
@@ -274,39 +296,45 @@ describe('parse()', function () {
it('parses a string with an alternative string delimiter', function (done) {
- expect(Qs.parse('a=b;c=d', { delimiter: ';' })).to.deep.equal({ a: 'b', c: 'd' });
+ expect(Qs.parse('a=b;c=d', { delimiter: ';' })).to.deep.equal({ a: 'b', c: 'd' }, { prototype: false });
done();
});
it('parses a string with an alternative RegExp delimiter', function (done) {
- expect(Qs.parse('a=b; c=d', { delimiter: /[;,] */ })).to.deep.equal({ a: 'b', c: 'd' });
+ expect(Qs.parse('a=b; c=d', { delimiter: /[;,] */ })).to.deep.equal({ a: 'b', c: 'd' }, { prototype: false });
done();
});
it('does not use non-splittable objects as delimiters', function (done) {
- expect(Qs.parse('a=b&c=d', { delimiter: true })).to.deep.equal({ a: 'b', c: 'd' });
+ expect(Qs.parse('a=b&c=d', { delimiter: true })).to.deep.equal({ a: 'b', c: 'd' }, { prototype: false });
done();
});
it('allows overriding parameter limit', function (done) {
- expect(Qs.parse('a=b&c=d', { parameterLimit: 1 })).to.deep.equal({ a: 'b' });
+ expect(Qs.parse('a=b&c=d', { parameterLimit: 1 })).to.deep.equal({ a: 'b' }, { prototype: false });
done();
});
it('allows setting the parameter limit to Infinity', function (done) {
- expect(Qs.parse('a=b&c=d', { parameterLimit: Infinity })).to.deep.equal({ a: 'b', c: 'd' });
+ expect(Qs.parse('a=b&c=d', { parameterLimit: Infinity })).to.deep.equal({ a: 'b', c: 'd' }, { prototype: false });
done();
});
it('allows overriding array limit', function (done) {
- expect(Qs.parse('a[0]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '0': 'b' } });
- expect(Qs.parse('a[-1]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '-1': 'b' } });
- expect(Qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 })).to.deep.equal({ a: { '0': 'b', '1': 'c' } });
+ expect(Qs.parse('a[0]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '0': 'b' } }, { prototype: false });
+ expect(Qs.parse('a[-1]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '-1': 'b' } }, { prototype: false });
+ expect(Qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }, { prototype: false });
+ done();
+ });
+
+ it('allows disabling array parsing', function (done) {
+
+ expect(Qs.parse('a[0]=b&a[1]=c', { parseArrays: false })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }, { prototype: false });
done();
});
@@ -326,7 +354,27 @@ describe('parse()', function () {
var result = Qs.parse(input);
- expect(result).to.deep.equal(expected);
+ expect(result).to.deep.equal(expected, { prototype: false });
+ done();
+ });
+
+ it('parses an object in dot notation', function (done) {
+
+ var input = {
+ 'user.name': {'pop[bob]': 3},
+ 'user.email.': null
+ };
+
+ var expected = {
+ 'user': {
+ 'name': {'pop[bob]': 3},
+ 'email': null
+ }
+ };
+
+ var result = Qs.parse(input);
+
+ expect(result).to.deep.equal(expected, { prototype: false });
done();
});
@@ -346,7 +394,7 @@ describe('parse()', function () {
var result = Qs.parse(input);
- expect(result).to.deep.equal(expected);
+ expect(result).to.deep.equal(expected, { prototype: false });
done();
});
@@ -356,13 +404,7 @@ describe('parse()', function () {
delete global.Buffer;
var result = Qs.parse('a=b&c=d');
global.Buffer = tempBuffer;
- expect(result).to.deep.equal({ a: 'b', c: 'd' });
- done();
- });
-
- it('does not crash when using invalid dot notation', function (done) {
-
- expect(Qs.parse('roomInfoList[0].childrenAges[0]=15&roomInfoList[0].numberOfAdults=2')).to.deep.equal({ roomInfoList: [['15', '2']] });
+ expect(result).to.deep.equal({ a: 'b', c: 'd' }, { prototype: false });
done();
});
@@ -381,7 +423,7 @@ describe('parse()', function () {
expect(parsed).to.contain('foo');
expect(parsed.foo).to.contain('bar', 'baz');
expect(parsed.foo.bar).to.equal('baz');
- expect(parsed.foo.baz).to.deep.equal(a);
+ expect(parsed.foo.baz).to.deep.equal(a, { prototype: false });
done();
});
@@ -390,24 +432,24 @@ describe('parse()', function () {
var a = Object.create(null);
a.b = 'c';
- expect(Qs.parse(a)).to.deep.equal({ b: 'c' });
+ expect(Qs.parse(a)).to.deep.equal({ b: 'c' }, { prototype: false });
var result = Qs.parse({ a: a });
expect(result).to.contain('a');
- expect(result.a).to.deep.equal(a);
+ expect(result.a).to.deep.equal(a, { prototype: false });
done();
});
it('parses dates correctly', function (done) {
var now = new Date();
- expect(Qs.parse({ a: now })).to.deep.equal({ a: now });
+ expect(Qs.parse({ a: now })).to.deep.equal({ a: now }, { prototype: false });
done();
});
it('parses regular expressions correctly', function (done) {
var re = /^test$/;
- expect(Qs.parse({ a: re })).to.deep.equal({ a: re });
+ expect(Qs.parse({ a: re })).to.deep.equal({ a: re }, { prototype: false });
done();
});
});
diff --git a/node_modules/request/node_modules/qs/test/stringify.js b/node_modules/request/node_modules/qs/test/stringify.js
index 7bdec3294..7a80c6c35 100755..100644
--- a/node_modules/request/node_modules/qs/test/stringify.js
+++ b/node_modules/request/node_modules/qs/test/stringify.js
@@ -26,6 +26,11 @@ describe('stringify()', function () {
expect(Qs.stringify({ a: 'b' })).to.equal('a=b');
expect(Qs.stringify({ a: 1 })).to.equal('a=1');
expect(Qs.stringify({ a: 1, b: 2 })).to.equal('a=1&b=2');
+ expect(Qs.stringify({ a: 'A_Z' })).to.equal('a=A_Z');
+ expect(Qs.stringify({ a: '€' })).to.equal('a=%E2%82%AC');
+ expect(Qs.stringify({ a: '' })).to.equal('a=%EE%80%80');
+ expect(Qs.stringify({ a: 'א' })).to.equal('a=%D7%90');
+ expect(Qs.stringify({ a: '𐐷' })).to.equal('a=%F0%90%90%B7');
done();
});
@@ -106,9 +111,15 @@ describe('stringify()', function () {
it('stringifies an empty value', function (done) {
expect(Qs.stringify({ a: '' })).to.equal('a=');
+ expect(Qs.stringify({ a: null }, {strictNullHandling: true})).to.equal('a');
+
expect(Qs.stringify({ a: '', b: '' })).to.equal('a=&b=');
- expect(Qs.stringify({ a: null })).to.equal('a=');
- expect(Qs.stringify({ a: { b: null } })).to.equal('a%5Bb%5D=');
+ expect(Qs.stringify({ a: null, b: '' }, {strictNullHandling: true})).to.equal('a&b=');
+
+ expect(Qs.stringify({ a: { b: '' } })).to.equal('a%5Bb%5D=');
+ expect(Qs.stringify({ a: { b: null } }, {strictNullHandling: true})).to.equal('a%5Bb%5D');
+ expect(Qs.stringify({ a: { b: null } }, {strictNullHandling: false})).to.equal('a%5Bb%5D=');
+
done();
});
@@ -143,7 +154,10 @@ describe('stringify()', function () {
it('drops keys with a value of undefined', function (done) {
expect(Qs.stringify({ a: undefined })).to.equal('');
- expect(Qs.stringify({ a: { b: undefined, c: null } })).to.equal('a%5Bc%5D=');
+
+ expect(Qs.stringify({ a: { b: undefined, c: null } }, {strictNullHandling: true})).to.equal('a%5Bc%5D');
+ expect(Qs.stringify({ a: { b: undefined, c: null } }, {strictNullHandling: false})).to.equal('a%5Bc%5D=');
+ expect(Qs.stringify({ a: { b: undefined, c: '' } })).to.equal('a%5Bc%5D=');
done();
});
@@ -163,7 +177,7 @@ describe('stringify()', function () {
it('stringifies the weird object from qs', function (done) {
- expect(Qs.stringify({ 'my weird field': 'q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F');
+ expect(Qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F');
done();
});
@@ -206,4 +220,40 @@ describe('stringify()', function () {
global.Buffer = tempBuffer;
done();
});
+
+ it('selects properties when filter=array', function (done) {
+
+ expect(Qs.stringify({ a: 'b' }, { filter: ['a'] })).to.equal('a=b');
+ expect(Qs.stringify({ a: 1}, { filter: [] })).to.equal('');
+ expect(Qs.stringify({ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, { filter: ['a', 'b', 0, 2]})).to.equal('a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3');
+ done();
+
+ });
+
+ it('supports custom representations when filter=function', function (done) {
+
+ var calls = 0;
+ var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } };
+ var filterFunc = function (prefix, value) {
+
+ calls++;
+ if (calls === 1) {
+ expect(prefix).to.be.empty();
+ expect(value).to.equal(obj);
+ }
+ else if (prefix === 'c') {
+ return;
+ }
+ else if (value instanceof Date) {
+ expect(prefix).to.equal('e[f]');
+ return value.getTime();
+ }
+ return value;
+ };
+
+ expect(Qs.stringify(obj, { filter: filterFunc })).to.equal('a=b&e%5Bf%5D=1257894000000');
+ expect(calls).to.equal(5);
+ done();
+
+ });
});
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 000000000..a9a6b520d
--- /dev/null
+++ b/node_modules/request/node_modules/qs/test/utils.js
@@ -0,0 +1,28 @@
+// Load modules
+
+var Code = require('code');
+var Lab = require('lab');
+var Utils = require('../lib/utils');
+
+
+// Declare internals
+
+var internals = {};
+
+
+// Test shortcuts
+
+var lab = exports.lab = Lab.script();
+var expect = Code.expect;
+var describe = lab.experiment;
+var it = lab.test;
+
+
+describe('merge()', function () {
+
+ it('can merge two objects with the same key', function (done) {
+
+ expect(Utils.merge({ a: 'b' }, { a: 'c' })).to.deep.equal({ a: ['b', 'c'] });
+ done();
+ });
+});
diff --git a/node_modules/request/node_modules/stringstream/package.json b/node_modules/request/node_modules/stringstream/package.json
index ed9a30674..37b7bec83 100644
--- a/node_modules/request/node_modules/stringstream/package.json
+++ b/node_modules/request/node_modules/stringstream/package.json
@@ -16,28 +16,16 @@
],
"repository": {
"type": "git",
- "url": "https://github.com/mhart/StringStream.git"
+ "url": "git+https://github.com/mhart/StringStream.git"
},
"license": "MIT",
"readme": "# Decode streams into strings The Right Way(tm)\n\n```javascript\nvar fs = require('fs')\nvar zlib = require('zlib')\nvar strs = require('stringstream')\n\nvar utf8Stream = fs.createReadStream('massiveLogFile.gz')\n .pipe(zlib.createGunzip())\n .pipe(strs('utf8'))\n```\n\nNo need to deal with `setEncoding()` weirdness, just compose streams\nlike they were supposed to be!\n\nHandles input and output encoding:\n\n```javascript\n// Stream from utf8 to hex to base64... Why not, ay.\nvar hex64Stream = fs.createReadStream('myFile')\n .pipe(strs('utf8', 'hex'))\n .pipe(strs('hex', 'base64'))\n```\n\nAlso deals with `base64` output correctly by aligning each emitted data\nchunk so that there are no dangling `=` characters:\n\n```javascript\nvar stream = fs.createReadStream('myFile').pipe(strs('base64'))\n\nvar base64Str = ''\n\nstream.on('data', function(data) { base64Str += data })\nstream.on('end', function() {\n console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding()\n console.log('Original file is: ' + new Buffer(base64Str, 'base64'))\n})\n```\n",
"readmeFilename": "README.md",
- "_id": "stringstream@0.0.4",
- "dist": {
- "shasum": "0f0e3423f942960b5692ac324a57dd093bc41a92",
- "tarball": "http://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz"
- },
- "_npmVersion": "1.2.0",
- "_npmUser": {
- "name": "hichaelmart",
- "email": "michael.hart.au@gmail.com"
+ "bugs": {
+ "url": "https://github.com/mhart/StringStream/issues"
},
- "maintainers": [
- {
- "name": "hichaelmart",
- "email": "michael.hart.au@gmail.com"
- }
- ],
- "directories": {},
+ "homepage": "https://github.com/mhart/StringStream#readme",
+ "_id": "stringstream@0.0.4",
"_shasum": "0f0e3423f942960b5692ac324a57dd093bc41a92",
"_resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz",
"_from": "stringstream@>=0.0.4 <0.1.0"
diff --git a/node_modules/request/node_modules/tough-cookie/.editorconfig b/node_modules/request/node_modules/tough-cookie/.editorconfig
new file mode 100644
index 000000000..e09b844f7
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/.editorconfig
@@ -0,0 +1,12 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+end_of_line = lf
+charset = utf-8
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 2
diff --git a/node_modules/request/node_modules/tough-cookie/.npmignore b/node_modules/request/node_modules/tough-cookie/.npmignore
index 54efff98f..5a8d2d853 100644
--- a/node_modules/request/node_modules/tough-cookie/.npmignore
+++ b/node_modules/request/node_modules/tough-cookie/.npmignore
@@ -1,3 +1,4 @@
+.idea
node_modules/
.*.sw[nmop]
npm-debug.log
diff --git a/node_modules/request/node_modules/tough-cookie/.travis.yml b/node_modules/request/node_modules/tough-cookie/.travis.yml
index 5d892654f..02059d0d5 100644
--- a/node_modules/request/node_modules/tough-cookie/.travis.yml
+++ b/node_modules/request/node_modules/tough-cookie/.travis.yml
@@ -1,7 +1,8 @@
language: node_js
node_js:
- "0.10"
-- "0.11"
+- "0.12"
+- iojs
matrix:
fast_finish: true
allow_failures:
diff --git a/node_modules/request/node_modules/tough-cookie/LICENSE b/node_modules/request/node_modules/tough-cookie/LICENSE
index 3fac4c85c..84e0cad17 100644
--- a/node_modules/request/node_modules/tough-cookie/LICENSE
+++ b/node_modules/request/node_modules/tough-cookie/LICENSE
@@ -1,21 +1,17 @@
-Copyright GoInstant, Inc. and other 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:
+Copyright (c) 2015, Salesforce.com, Inc.
+All rights reserved.
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
+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.
+
+===
The following exceptions apply:
@@ -37,24 +33,24 @@ under the terms of the MPL 1.1:
// ***** BEGIN LICENSE BLOCK *****
// Version: MPL 1.1/GPL 2.0/LGPL 2.1
- //
- // The contents of this file are subject to the Mozilla Public License Version
- // 1.1 (the "License"); you may not use this file except in compliance with
- // the License. You may obtain a copy of the License at
+ //
+ // The contents of this file are subject to the Mozilla Public License Version
+ // 1.1 (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.mozilla.org/MPL/
- //
+ //
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// for the specific language governing rights and limitations under the
// License.
- //
+ //
// The Original Code is the Public Suffix List.
- //
+ //
// The Initial Developer of the Original Code is
// Jo Hermans <jo.hermans@gmail.com>.
// Portions created by the Initial Developer are Copyright (C) 2007
// the Initial Developer. All Rights Reserved.
- //
+ //
// Contributor(s):
// Ruben Arakelyan <ruben@rubenarakelyan.com>
// Gervase Markham <gerv@gerv.net>
@@ -62,7 +58,7 @@ under the terms of the MPL 1.1:
// David Triendl <david@triendl.name>
// Jothan Frakes <jothan@gmail.com>
// The kind representatives of many TLD registries
- //
+ //
// Alternatively, the contents of this file may be used under the terms of
// either the GNU General Public License Version 2 or later (the "GPL"), or
// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
@@ -74,5 +70,5 @@ under the terms of the MPL 1.1:
// and other provisions required by the GPL or the LGPL. If you do not delete
// the provisions above, a recipient may use your version of this file under
// the terms of any one of the MPL, the GPL or the LGPL.
- //
+ //
// ***** END LICENSE BLOCK *****
diff --git a/node_modules/request/node_modules/tough-cookie/README.md b/node_modules/request/node_modules/tough-cookie/README.md
index 9e6caee18..f56d153f1 100644
--- a/node_modules/request/node_modules/tough-cookie/README.md
+++ b/node_modules/request/node_modules/tough-cookie/README.md
@@ -1,8 +1,6 @@
-[RFC6265](http://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js
+[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js
-![Tough Cookie](http://www.goinstant.com.s3.amazonaws.com/tough-cookie.jpg)
-
-[![Build Status](https://travis-ci.org/goinstant/node-cookie.png?branch=master)](https://travis-ci.org/goinstant/node-cookie)
+[![Build Status](https://travis-ci.org/SalesforceEng/tough-cookie.png?branch=master)](https://travis-ci.org/SalesforceEng/tough-cookie)
[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie)
![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9)
@@ -30,8 +28,6 @@ It's _so_ easy!
`npm install tough-cookie`
-Requires `punycode`, which should get installed automatically for you. Note that node.js v0.6.2+ bundles punycode by default.
-
Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken.
# API
@@ -41,10 +37,12 @@ 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".
-parseDate(string[,strict])
+**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()`. If strict is set to true then leading/trailing non-seperator characters around the time part will cause the parsing to fail (e.g. "Thu, 01 Jan 1970 00:00:010 GMT" has an extra trailing zero but Chrome, an assumedly RFC-compliant browser, treats this as valid).
+Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`.
formatDate(date)
----------------
@@ -77,10 +75,10 @@ Answers "does the request-path path-match a given cookie-path?" as per RFC6265 S
This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`.
-parse(header[,strict=false])
+parse(header)
----------------------------
-alias for `Cookie.parse(header[,strict])`
+alias for `Cookie.parse(header)`
fromJSON(string)
----------------
@@ -120,10 +118,10 @@ Generates a list of all possible paths that `pathMatch()` the parameter. May be
Cookie
======
-Cookie.parse(header[,strict=false])
+Cookie.parse(header)
-----------------------------------
-Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. If in strict mode, returns `undefined` if the cookie doesn't follow the guidelines in section 4 of RFC6265. Generally speaking, strict mode can be used to validate your own generated Set-Cookie headers, but acting as a client you want to be lenient and leave strict mode off.
+Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed.
Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response:
@@ -254,7 +252,6 @@ 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
- * _strict_ - boolean - default `false` - perform extra checks
* _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. CookieStore 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).
@@ -376,37 +373,50 @@ The implementation MUST NOT pass an error if the cookie doesn't exist; only pass
store.removeCookies(domain, path, cb(err))
------------------------------------------
-Removes matching cookies from the store. The `path` paramter is optional, and if missing means all paths in a domain should be removed.
+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.
-# TODO
+MemoryCookieStore
+=================
- * _full_ RFC5890/RFC5891 canonicalization for domains in `cdomain()`
- * the optional `punycode` requirement implements RFC3492, but RFC6265 requires RFC5891
- * better tests for `validate()`?
+Inherits from Store.
+
+Just-in-memory CookieJar synchronous store implementation, used by default.
# Copyright and License
-(tl;dr: MIT with some MPL/1.1)
-
-Copyright 2012- GoInstant, Inc. and other 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.
+(tl;dr: BSD-3-Clause with some MPL/1.1)
+
+```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.
+```
Portions may be licensed under different licenses (in particular public-suffix.txt is MPL/1.1); please read the LICENSE file for full details.
diff --git a/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js b/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js
index 74d76aa1c..ba054f4cb 100644
--- a/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js
+++ b/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js
@@ -1,22 +1,32 @@
-/*
- * Copyright GoInstant, Inc. and other 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:
+/*!
+ * Copyright (c) 2015, Salesforce.com, Inc.
+ * All rights reserved.
*
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
*
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
+ * 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 fs = require('fs');
@@ -59,6 +69,9 @@ function processList(lines) {
w.write(" * DO NOT EDIT! *\n");
w.write(" ****************************************************/\n\n");
+ w.write('"use strict";\n\n');
+ w.write("var punycode = require('punycode');\n\n");
+
w.write("module.exports.getPublicSuffix = ");
w.write(getPublicSuffix.toString());
w.write(";\n\n");
@@ -90,25 +103,35 @@ function addToIndex(index,line) {
// include the licence in the function since it gets written to pubsuffix.js
function getPublicSuffix(domain) {
- /*
- * Copyright GoInstant, Inc. and other 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:
+ /*!
+ * 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.
*
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
+ * 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.
*
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
+ * 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.
*/
if (!domain) {
return null;
@@ -116,6 +139,15 @@ function getPublicSuffix(domain) {
if (domain.match(/^\./)) {
return null;
}
+ var asciiDomain = punycode.toASCII(domain);
+ var converted = false;
+ if (asciiDomain !== domain) {
+ domain = asciiDomain;
+ converted = true;
+ }
+ if (index[domain]) {
+ return null;
+ }
domain = domain.toLowerCase();
var parts = domain.split('.').reverse();
@@ -136,15 +168,17 @@ function getPublicSuffix(domain) {
suffixLen = i+1;
}
- suffix = '.'+part+suffix;
+ suffix = '.'+partstr;
}
if (index['*'+suffix]) { // *.domain exists (e.g. *.kyoto.jp for domain='kyoto.jp');
return null;
}
- if (suffixLen && parts.length > suffixLen) {
- return parts.slice(0,suffixLen+1).reverse().join('.');
+ suffixLen = suffixLen || 1;
+ if (parts.length > suffixLen) {
+ var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.');
+ return converted ? punycode.toUnicode(publicSuffix) : publicSuffix;
}
return null;
@@ -155,7 +189,7 @@ function checkPublicSuffix(give,get) {
assert.equal(got, get, give+' should be '+(get==null?'NULL':get)+' but got '+got);
}
-// pubSufTest() was converted to JavaScript from http://publicsuffix.org/list/test.txt
+// pubSufTest() was converted to JavaScript from http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1
function pubSufTest() {
// For this function-scope and this function-scope ONLY:
// Any copyright is dedicated to the Public Domain.
@@ -174,14 +208,14 @@ function pubSufTest() {
checkPublicSuffix('.example.example', null);
// Unlisted TLD.
checkPublicSuffix('example', null);
- checkPublicSuffix('example.example', null);
- checkPublicSuffix('b.example.example', null);
- checkPublicSuffix('a.b.example.example', null);
+ checkPublicSuffix('example.example', 'example.example');
+ checkPublicSuffix('b.example.example', 'example.example');
+ checkPublicSuffix('a.b.example.example', 'example.example');
// Listed, but non-Internet, TLD.
- checkPublicSuffix('local', null);
- checkPublicSuffix('example.local', null);
- checkPublicSuffix('b.example.local', null);
- checkPublicSuffix('a.b.example.local', null);
+ //checkPublicSuffix('local', null);
+ //checkPublicSuffix('example.local', null);
+ //checkPublicSuffix('b.example.local', null);
+ //checkPublicSuffix('a.b.example.local', null);
// TLD with only 1 rule.
checkPublicSuffix('biz', null);
checkPublicSuffix('domain.biz', 'domain.biz');
@@ -210,20 +244,22 @@ function pubSufTest() {
checkPublicSuffix('test.ac.jp', 'test.ac.jp');
checkPublicSuffix('www.test.ac.jp', 'test.ac.jp');
checkPublicSuffix('kyoto.jp', null);
- checkPublicSuffix('c.kyoto.jp', null);
- checkPublicSuffix('b.c.kyoto.jp', 'b.c.kyoto.jp');
- checkPublicSuffix('a.b.c.kyoto.jp', 'b.c.kyoto.jp');
- checkPublicSuffix('pref.kyoto.jp', 'pref.kyoto.jp'); // Exception rule.
- checkPublicSuffix('www.pref.kyoto.jp', 'pref.kyoto.jp'); // Exception rule.
- checkPublicSuffix('city.kyoto.jp', 'city.kyoto.jp'); // Exception rule.
- checkPublicSuffix('www.city.kyoto.jp', 'city.kyoto.jp'); // Exception rule.
+ checkPublicSuffix('test.kyoto.jp', 'test.kyoto.jp');
+ checkPublicSuffix('ide.kyoto.jp', null);
+ checkPublicSuffix('b.ide.kyoto.jp', 'b.ide.kyoto.jp');
+ checkPublicSuffix('a.b.ide.kyoto.jp', 'b.ide.kyoto.jp');
+ checkPublicSuffix('c.kobe.jp', null);
+ checkPublicSuffix('b.c.kobe.jp', 'b.c.kobe.jp');
+ checkPublicSuffix('a.b.c.kobe.jp', 'b.c.kobe.jp');
+ checkPublicSuffix('city.kobe.jp', 'city.kobe.jp');
+ checkPublicSuffix('www.city.kobe.jp', 'city.kobe.jp');
// TLD with a wildcard rule and exceptions.
- checkPublicSuffix('om', null);
- checkPublicSuffix('test.om', null);
- checkPublicSuffix('b.test.om', 'b.test.om');
- checkPublicSuffix('a.b.test.om', 'b.test.om');
- checkPublicSuffix('songfest.om', 'songfest.om');
- checkPublicSuffix('www.songfest.om', 'songfest.om');
+ checkPublicSuffix('ck', null);
+ checkPublicSuffix('test.ck', null);
+ checkPublicSuffix('b.test.ck', 'b.test.ck');
+ checkPublicSuffix('a.b.test.ck', 'b.test.ck');
+ checkPublicSuffix('www.ck', 'www.ck');
+ checkPublicSuffix('www.www.ck', 'www.ck');
// US K12.
checkPublicSuffix('us', null);
checkPublicSuffix('test.us', 'test.us');
@@ -234,6 +270,24 @@ function pubSufTest() {
checkPublicSuffix('k12.ak.us', null);
checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us');
checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us');
-
-
+ // IDN labels.
+ checkPublicSuffix('食狮.com.cn', '食狮.com.cn');
+ checkPublicSuffix('食狮.公司.cn', '食狮.公司.cn');
+ checkPublicSuffix('www.食狮.公司.cn', '食狮.公司.cn');
+ checkPublicSuffix('shishi.公司.cn', 'shishi.公司.cn');
+ checkPublicSuffix('公司.cn', null);
+ checkPublicSuffix('食狮.中国', '食狮.中国');
+ checkPublicSuffix('www.食狮.中国', '食狮.中国');
+ checkPublicSuffix('shishi.中国', 'shishi.中国');
+ checkPublicSuffix('中国', null);
+ // Same as above, but punycoded.
+ checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn');
+ checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn');
+ checkPublicSuffix('www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn');
+ checkPublicSuffix('shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn');
+ checkPublicSuffix('xn--55qx5d.cn', null);
+ checkPublicSuffix('xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s');
+ checkPublicSuffix('www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s');
+ checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s');
+ checkPublicSuffix('xn--fiqs8s', null);
}
diff --git a/node_modules/request/node_modules/tough-cookie/lib/cookie.js b/node_modules/request/node_modules/tough-cookie/lib/cookie.js
index c93e927ae..bec7f90b1 100644
--- a/node_modules/request/node_modules/tough-cookie/lib/cookie.js
+++ b/node_modules/request/node_modules/tough-cookie/lib/cookie.js
@@ -1,29 +1,40 @@
-/*
- * Copyright GoInstant, Inc. and other 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:
+/*!
+ * 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.
*
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
+ * 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.
*
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
+ * THIS 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 pubsuffix = require('./pubsuffix');
var Store = require('./store').Store;
+var MemoryCookieStore = require('./memstore').MemoryCookieStore;
+var pathMatch = require('./pathMatch').pathMatch;
var punycode;
try {
@@ -34,42 +45,29 @@ try {
var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;
-// From RFC2616 S2.2:
-var TOKEN = /[\x21\x23-\x26\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/;
-
// From RFC6265 S4.1.1
// note that it excludes \x3B ";"
var COOKIE_OCTET = /[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]/;
var COOKIE_OCTETS = new RegExp('^'+COOKIE_OCTET.source+'$');
-// The name/key cannot be empty but the value can (S5.2):
-var COOKIE_PAIR_STRICT = new RegExp('^('+TOKEN.source+'+)=("?)('+COOKIE_OCTET.source+'*)\\2$');
-var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/;
+// Double quotes are part of the value (see: S4.1.1).
+// '\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)
+// '=' and ';' are attribute/values separators
+// (see: https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L64)
+var COOKIE_PAIR = /^([^=;]+)\s*=\s*(("?)[^\n\r\0]*\3)/;
-// RFC6265 S4.1.1 defines extension-av as 'any CHAR except CTLs or ";"'
+// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"'
// Note ';' is \x3B
-var NON_CTL_SEMICOLON = /[\x20-\x3A\x3C-\x7E]+/;
-var EXTENSION_AV = NON_CTL_SEMICOLON;
-var PATH_VALUE = NON_CTL_SEMICOLON;
+var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/;
// Used for checking whether or not there is a trailing semi-colon
var TRAILING_SEMICOLON = /;+$/;
-/* RFC6265 S5.1.1.5:
- * [fail if] the day-of-month-value is less than 1 or greater than 31
- */
-var DAY_OF_MONTH = /^(0?[1-9]|[12][0-9]|3[01])$/;
+var DAY_OF_MONTH = /^(\d{1,2})[^\d]*$/;
+var TIME = /^(\d{1,2})[^\d]*:(\d{1,2})[^\d]*:(\d{1,2})[^\d]*$/;
+var MONTH = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/i;
-/* RFC6265 S5.1.1.5:
- * [fail if]
- * * the hour-value is greater than 23,
- * * the minute-value is greater than 59, or
- * * the second-value is greater than 59.
- */
-var TIME = /(0?[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/;
-var STRICT_TIME = /^(0?[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/;
-
-var MONTH = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)$/i;
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
@@ -81,18 +79,19 @@ var NUM_TO_DAY = [
'Sun','Mon','Tue','Wed','Thu','Fri','Sat'
];
-var YEAR = /^([1-9][0-9]{1,3})$/; // 2 to 4 digits
+var YEAR = /^(\d{2}|\d{4})$/; // 2 to 4 digits
var MAX_TIME = 2147483647000; // 31-bit max
var MIN_TIME = 0; // 31-bit min
+var cookiesCreated = 0; // Number of cookies created in runtime
+
// RFC6265 S5.1.1 date parser:
-function parseDate(str,strict) {
+function parseDate(str) {
if (!str) {
return;
}
- var found_time, found_dom, found_month, found_year;
/* RFC6265 S5.1.1:
* 2. Process each date-token sequentially in the order the date-tokens
@@ -103,8 +102,12 @@ function parseDate(str,strict) {
return;
}
- var date = new Date();
- date.setMilliseconds(0);
+ var hour = null;
+ var minutes = null;
+ var seconds = null;
+ var day = null;
+ var month = null;
+ var year = null;
for (var i=0; i<tokens.length; i++) {
var token = tokens[i].trim();
@@ -120,13 +123,22 @@ function parseDate(str,strict) {
* the date-token, respectively. Skip the remaining sub-steps and continue
* to the next date-token.
*/
- if (!found_time) {
- result = (strict ? STRICT_TIME : TIME).exec(token);
+ if (seconds === null) {
+ result = TIME.exec(token);
if (result) {
- found_time = true;
- date.setUTCHours(result[1]);
- date.setUTCMinutes(result[2]);
- date.setUTCSeconds(result[3]);
+ hour = parseInt(result[1], 10);
+ minutes = parseInt(result[2], 10);
+ seconds = parseInt(result[3], 10);
+ /* RFC6265 S5.1.1.5:
+ * [fail if]
+ * * the hour-value is greater than 23,
+ * * the minute-value is greater than 59, or
+ * * the second-value is greater than 59.
+ */
+ if(hour > 23 || minutes > 59 || seconds > 59) {
+ return;
+ }
+
continue;
}
}
@@ -136,11 +148,16 @@ function parseDate(str,strict) {
* the day-of-month-value to the number denoted by the date-token. Skip
* the remaining sub-steps and continue to the next date-token.
*/
- if (!found_dom) {
+ if (day === null) {
result = DAY_OF_MONTH.exec(token);
if (result) {
- found_dom = true;
- date.setUTCDate(result[1]);
+ day = parseInt(result, 10);
+ /* RFC6265 S5.1.1.5:
+ * [fail if] the day-of-month-value is less than 1 or greater than 31
+ */
+ if(day < 1 || day > 31) {
+ return;
+ }
continue;
}
}
@@ -150,11 +167,10 @@ function parseDate(str,strict) {
* the month denoted by the date-token. Skip the remaining sub-steps and
* continue to the next date-token.
*/
- if (!found_month) {
+ if (month === null) {
result = MONTH.exec(token);
if (result) {
- found_month = true;
- date.setUTCMonth(MONTH_TO_NUM[result[1].toLowerCase()]);
+ month = MONTH_TO_NUM[result[1].toLowerCase()];
continue;
}
}
@@ -164,10 +180,10 @@ function parseDate(str,strict) {
* denoted by the date-token. Skip the remaining sub-steps and continue to
* the next date-token.
*/
- if (!found_year) {
+ if (year === null) {
result = YEAR.exec(token);
if (result) {
- var year = result[0];
+ year = parseInt(result[0], 10);
/* From S5.1.1:
* 3. If the year-value is greater than or equal to 70 and less
* than or equal to 99, increment the year-value by 1900.
@@ -183,20 +199,16 @@ function parseDate(str,strict) {
if (year < 1601) {
return; // 5. ... the year-value is less than 1601
}
-
- found_year = true;
- date.setUTCFullYear(year);
- continue;
}
}
}
- if (!(found_time && found_dom && found_month && found_year)) {
+ if (seconds === null || day === null || month === null || year === null) {
return; // 5. ... at least one of the found-day-of-month, found-month, found-
// year, or found-time flags is not set,
}
- return date;
+ return new Date(Date.UTC(year, month, day, hour, minutes, seconds));
}
function formatDate(date) {
@@ -303,52 +315,19 @@ function defaultPath(path) {
return path.slice(0, rightSlash);
}
-/*
- * "A request-path path-matches a given cookie-path if at least one of the
- * following conditions holds:"
- */
-function pathMatch(reqPath,cookiePath) {
- // "o The cookie-path and the request-path are identical."
- if (cookiePath === reqPath) {
- return true;
- }
-
- var idx = reqPath.indexOf(cookiePath);
- if (idx === 0) {
- // "o The cookie-path is a prefix of the request-path, and the last
- // character of the cookie-path is %x2F ("/")."
- if (cookiePath.substr(-1) === "/") {
- return true;
- }
-
- // " o The cookie-path is a prefix of the request-path, and the first
- // character of the request-path that is not included in the cookie- path
- // is a %x2F ("/") character."
- if (reqPath.substr(cookiePath.length,1) === "/") {
- return true;
- }
- }
- return false;
-}
-
-function parse(str, strict) {
+function parse(str) {
str = str.trim();
// S4.1.1 Trailing semi-colons are not part of the specification.
- // If we are not in strict mode we remove the trailing semi-colons.
var semiColonCheck = TRAILING_SEMICOLON.exec(str);
if (semiColonCheck) {
- if (strict) {
- return;
- }
str = str.slice(0, semiColonCheck.index);
}
// We use a regex to parse the "name-value-pair" part of S5.2
var firstSemi = str.indexOf(';'); // S5.2 step 1
- var pairRx = strict ? COOKIE_PAIR_STRICT : COOKIE_PAIR;
- var result = pairRx.exec(firstSemi === -1 ? str : str.substr(0,firstSemi));
+ var result = COOKIE_PAIR.exec(firstSemi === -1 ? str : str.substr(0,firstSemi));
// Rx satisfies the "the name string is empty" and "lacks a %x3D ("=")"
// constraints as well as trimming any whitespace.
@@ -357,8 +336,8 @@ function parse(str, strict) {
}
var c = new Cookie();
- c.key = result[1]; // the regexp should trim() already
- c.value = result[3]; // [2] is quotes or empty-string
+ c.key = result[1].trim();
+ c.value = result[2].trim();
if (firstSemi === -1) {
return c;
@@ -386,13 +365,9 @@ function parse(str, strict) {
var cookie_avs = unparsed.split(/\s*;\s*/);
while (cookie_avs.length) {
var av = cookie_avs.shift();
-
- if (strict && !EXTENSION_AV.test(av)) {
- return;
- }
-
var av_sep = av.indexOf('=');
var av_key, av_value;
+
if (av_sep === -1) {
av_key = av;
av_value = null;
@@ -402,47 +377,51 @@ function parse(str, strict) {
}
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) {if(strict){return;}else{break;} }
- var exp = parseDate(av_value,strict);
- // "If the attribute-value failed to parse as a cookie date, ignore the
- // cookie-av."
- if (exp == null) { if(strict){return;}else{break;} }
- c.expires = 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)
+ 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(strict){return;}else{break;} }
- // "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)) { if(strict){return;}else{break;} }
- var delta = parseInt(av_value,10);
- if (strict && delta <= 0) {
- return; // S4.1.1
+ 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);
+ }
}
- // "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) { if(strict){return;}else{break;} }
- // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E
- // (".") character."
- var domain = av_value.trim().replace(/^\./,'');
- if (!domain) { if(strict){return;}else{break;} } // see "is empty" above
- // "Convert the cookie-domain to lower case."
- c.domain = domain.toLowerCase();
+ 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
@@ -456,10 +435,7 @@ function parse(str, strict) {
* We'll represent the default-path as null since it depends on the
* context of the parsing.
*/
- if (!av_value || av_value.substr(0,1) != "/") {
- if(strict){return;}else{break;}
- }
- c.path = av_value;
+ c.path = av_value && av_value[0] === "/" ? av_value : null;
break;
case 'secure': // S5.2.5
@@ -468,12 +444,10 @@ function parse(str, strict) {
* the user agent MUST append an attribute to the cookie-attribute-list
* with an attribute-name of Secure and an empty attribute-value."
*/
- if (av_value != null) { if(strict){return;} }
c.secure = true;
break;
case 'httponly': // S5.2.6 -- effectively the same as 'secure'
- if (av_value != null) { if(strict){return;} }
c.httpOnly = true;
break;
@@ -486,6 +460,10 @@ function parse(str, strict) {
// ensure a default date for sorting:
c.creation = new Date();
+ //NOTE: add runtime index for the cookieCompare() to resolve the situation when Date's precision is not enough .
+ //Store initial UTC time as well, so we will be able to determine if we need to fallback to the Date object.
+ c._creationRuntimeIdx = ++cookiesCreated;
+ c._initialCreationTime = c.creation.getTime();
return c;
}
@@ -539,31 +517,18 @@ function cookieCompare(a,b) {
if (deltaLen !== 0) {
return deltaLen;
}
- // ascending for time: a CMP b
- return (a.creation ? a.creation.getTime() : MAX_TIME) -
- (b.creation ? b.creation.getTime() : MAX_TIME);
-}
-// Gives the permutation of all possible domainMatch()es of a given domain. The
-// array is in shortest-to-longest order. Handy for indexing.
-function permuteDomain(domain) {
- var pubSuf = pubsuffix.getPublicSuffix(domain);
- if (!pubSuf) {
- return null;
- }
- if (pubSuf == domain) {
- return [domain];
- }
+ var aTime = a.creation ? a.creation.getTime() : MAX_TIME;
+ var bTime = b.creation ? b.creation.getTime() : MAX_TIME;
- var prefix = domain.slice(0,-(pubSuf.length+1)); // ".example.com"
- var parts = prefix.split('.').reverse();
- var cur = pubSuf;
- var permutations = [cur];
- while (parts.length) {
- cur = parts.shift()+'.'+cur;
- permutations.push(cur);
+ // NOTE: if creation dates are equal and they were not modified from the outside,
+ // then use _creationRuntimeIdx for the comparison.
+ if(aTime === bTime && aTime === a._initialCreationTime && bTime === b._initialCreationTime) {
+ return a._creationRuntimeIdx - b._creationRuntimeIdx;
}
- return permutations;
+
+ // ascending for time: a CMP b
+ return aTime - bTime;
}
// Gives the permutation of all possible pathMatch()es of a given path. The
@@ -588,6 +553,21 @@ function permutePath(path) {
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 (opts) {
if (typeof opts !== "object") {
@@ -619,6 +599,8 @@ Cookie.prototype.extensions = null;
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._initialCreationTime = null; // Used to determine if cookie.creation was modified
+Cookie.prototype._creationRuntimeIdx = null; // Runtime index of the created cookie, used in cookieCompare()
Cookie.prototype.lastAccessed = null; // Date when set
var cookieProperties = Object.freeze(Object.keys(Cookie.prototype).map(function(p) {
@@ -642,7 +624,7 @@ Cookie.prototype.validate = function validate() {
if (!COOKIE_OCTETS.test(this.value)) {
return false;
}
- if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires,true)) {
+ if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires)) {
return false;
}
if (this.maxAge != null && this.maxAge <= 0) {
@@ -801,15 +783,13 @@ Cookie.prototype.canonicalizedDomain = function canonicalizedDomain() {
};
-var memstore;
function CookieJar(store, rejectPublicSuffixes) {
if (rejectPublicSuffixes != null) {
this.rejectPublicSuffixes = rejectPublicSuffixes;
}
if (!store) {
- memstore = memstore || require('./memstore');
- store = new memstore.MemoryCookieStore();
+ store = new MemoryCookieStore();
}
this.store = store;
}
@@ -820,7 +800,7 @@ var CAN_BE_SYNC = [];
CAN_BE_SYNC.push('setCookie');
CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
var err;
- var context = (url instanceof Object) ? url : urlParse(url);
+ var context = getCookieContext(url);
if (options instanceof Function) {
cb = options;
options = {};
@@ -830,7 +810,7 @@ CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
// S5.3 step 1
if (!(cookie instanceof Cookie)) {
- cookie = Cookie.parse(cookie, options.strict === true);
+ cookie = Cookie.parse(cookie);
}
if (!cookie) {
err = new Error("Cookie failed to parse");
@@ -869,15 +849,12 @@ CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
cookie.domain = host;
}
- // S5.3 step 7: "Otherwise, set the cookie's path to the default-path of the
- // request-uri"
- if (!cookie.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.
+ if (!cookie.path || cookie.path[0] !== '/') {
cookie.path = defaultPath(context.pathname);
cookie.pathIsDefault = true;
- } else {
- if (cookie.path.length > 1 && cookie.path.substr(-1) == '/') {
- cookie.path = cookie.path.slice(0,-1);
- }
}
// S5.3 step 8: NOOP; secure attribute
@@ -934,7 +911,7 @@ CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
// RFC6365 S5.4
CAN_BE_SYNC.push('getCookies');
CookieJar.prototype.getCookies = function(url, options, cb) {
- var context = (url instanceof Object) ? url : urlParse(url);
+ var context = getCookieContext(url);
if (options instanceof Function) {
cb = options;
options = {};
@@ -1035,9 +1012,12 @@ CookieJar.prototype.getCookieString = function(/*..., cb*/) {
if (err) {
cb(err);
} else {
- cb(null, cookies.map(function(c){
- return c.cookieString();
- }).join('; '));
+ cb(null, cookies
+ .sort(cookieCompare)
+ .map(function(c){
+ return c.cookieString();
+ })
+ .join('; '));
}
};
args.push(next);
@@ -1092,6 +1072,7 @@ module.exports = {
CookieJar: CookieJar,
Cookie: Cookie,
Store: Store,
+ MemoryCookieStore: MemoryCookieStore,
parseDate: parseDate,
formatDate: formatDate,
parse: parse,
@@ -1101,7 +1082,7 @@ module.exports = {
pathMatch: pathMatch,
getPublicSuffix: pubsuffix.getPublicSuffix,
cookieCompare: cookieCompare,
- permuteDomain: permuteDomain,
+ permuteDomain: require('./permuteDomain').permuteDomain,
permutePath: permutePath,
- canonicalDomain: canonicalDomain,
+ canonicalDomain: canonicalDomain
};
diff --git a/node_modules/request/node_modules/tough-cookie/lib/memstore.js b/node_modules/request/node_modules/tough-cookie/lib/memstore.js
index fc5774c8a..a9ddc6f4c 100644
--- a/node_modules/request/node_modules/tough-cookie/lib/memstore.js
+++ b/node_modules/request/node_modules/tough-cookie/lib/memstore.js
@@ -1,8 +1,37 @@
+/*!
+ * 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 tough = require('./cookie');
var Store = require('./store').Store;
-var permuteDomain = tough.permuteDomain;
-var permutePath = tough.permutePath;
+var permuteDomain = require('./permuteDomain').permuteDomain;
+var pathMatch = require('./pathMatch').pathMatch;
var util = require('util');
function MemoryCookieStore() {
@@ -37,7 +66,7 @@ MemoryCookieStore.prototype.findCookies = function(domain, path, cb) {
var pathMatcher;
if (!path) {
- // null or '/' means "all paths"
+ // null means "all paths"
pathMatcher = function matchAll(domainIndex) {
for (var curPath in domainIndex) {
var pathIndex = domainIndex[curPath];
@@ -47,30 +76,20 @@ MemoryCookieStore.prototype.findCookies = function(domain, path, cb) {
}
};
- } else if (path === '/') {
- pathMatcher = function matchSlash(domainIndex) {
- var pathIndex = domainIndex['/'];
- if (!pathIndex) {
- return;
- }
- for (var key in pathIndex) {
- results.push(pathIndex[key]);
- }
- };
-
} else {
- var paths = permutePath(path) || [path];
pathMatcher = function matchRFC(domainIndex) {
- paths.forEach(function(curPath) {
- var pathIndex = domainIndex[curPath];
- if (!pathIndex) {
- return;
- }
- for (var key in pathIndex) {
- results.push(pathIndex[key]);
- }
- });
- };
+ //NOTE: we should use path-match algorithm from S5.1.4 here
+ //(see : https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/canonical_cookie.cc#L299)
+ Object.keys(domainIndex).forEach(function (cookiePath) {
+ if (pathMatch(path, cookiePath)) {
+ var pathIndex = domainIndex[cookiePath];
+
+ for (var key in pathIndex) {
+ results.push(pathIndex[key]);
+ }
+ }
+ });
+ };
}
var domains = permuteDomain(domain) || [domain];
diff --git a/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js b/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js
new file mode 100644
index 000000000..7c7a79f1f
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js
@@ -0,0 +1,61 @@
+/*!
+ * 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";
+/*
+ * "A request-path path-matches a given cookie-path if at least one of the
+ * following conditions holds:"
+ */
+function pathMatch (reqPath, cookiePath) {
+ // "o The cookie-path and the request-path are identical."
+ if (cookiePath === reqPath) {
+ return true;
+ }
+
+ var idx = reqPath.indexOf(cookiePath);
+ if (idx === 0) {
+ // "o The cookie-path is a prefix of the request-path, and the last
+ // character of the cookie-path is %x2F ("/")."
+ if (cookiePath.substr(-1) === "/") {
+ return true;
+ }
+
+ // " o The cookie-path is a prefix of the request-path, and the first
+ // character of the request-path that is not included in the cookie- path
+ // is a %x2F ("/") character."
+ if (reqPath.substr(cookiePath.length, 1) === "/") {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+exports.pathMatch = pathMatch;
diff --git a/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js b/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js
new file mode 100644
index 000000000..8af841b65
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js
@@ -0,0 +1,56 @@
+/*!
+ * 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 pubsuffix = require('./pubsuffix');
+
+// Gives the permutation of all possible domainMatch()es of a given domain. The
+// array is in shortest-to-longest order. Handy for indexing.
+function permuteDomain (domain) {
+ var pubSuf = pubsuffix.getPublicSuffix(domain);
+ if (!pubSuf) {
+ return null;
+ }
+ if (pubSuf == domain) {
+ return [domain];
+ }
+
+ var prefix = domain.slice(0, -(pubSuf.length + 1)); // ".example.com"
+ var parts = prefix.split('.').reverse();
+ var cur = pubSuf;
+ var permutations = [cur];
+ while (parts.length) {
+ cur = parts.shift() + '.' + cur;
+ permutations.push(cur);
+ }
+ return permutations;
+}
+
+exports.permuteDomain = permuteDomain;
diff --git a/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js b/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
index a7031473b..f07aa2bf8 100644
--- a/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
+++ b/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
@@ -3,29 +3,56 @@
* DO NOT EDIT! *
****************************************************/
+"use strict";
+
+var punycode = require('punycode');
+
module.exports.getPublicSuffix = function getPublicSuffix(domain) {
- /*
- * Copyright GoInstant, Inc. and other 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:
+ /*!
+ * 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:
*
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
*
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
+ * 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.
*/
- if (!domain) return null;
- if (domain.match(/^\./)) return null;
+ if (!domain) {
+ return null;
+ }
+ if (domain.match(/^\./)) {
+ return null;
+ }
+ var asciiDomain = punycode.toASCII(domain);
+ var converted = false;
+ if (asciiDomain !== domain) {
+ domain = asciiDomain;
+ converted = true;
+ }
+ if (index[domain]) {
+ return null;
+ }
domain = domain.toLowerCase();
var parts = domain.split('.').reverse();
@@ -46,15 +73,17 @@ module.exports.getPublicSuffix = function getPublicSuffix(domain) {
suffixLen = i+1;
}
- suffix = '.'+part+suffix;
+ suffix = '.'+partstr;
}
if (index['*'+suffix]) { // *.domain exists (e.g. *.kyoto.jp for domain='kyoto.jp');
return null;
}
- if (suffixLen && parts.length > suffixLen) {
- return parts.slice(0,suffixLen+1).reverse().join('.');
+ suffixLen = suffixLen || 1;
+ if (parts.length > suffixLen) {
+ var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.');
+ return converted ? punycode.toUnicode(publicSuffix) : publicSuffix;
}
return null;
@@ -64,6 +93,6 @@ module.exports.getPublicSuffix = function getPublicSuffix(domain) {
// See public-suffix.txt for more information
var index = module.exports.index = Object.freeze(
-{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"marketplace.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"taxi.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"an":true,"com.an":true,"net.an":true,"org.an":true,"edu.an":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"*.ar":true,"congresodelalengua3.ar":false,"educ.ar":false,"gobiernoelectronico.ar":false,"mecon.ar":false,"nacion.ar":false,"nic.ar":false,"promocion.ar":false,"retina.ar":false,"uba.ar":false,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"csiro.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"act.gov.au":true,"nt.gov.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"org.ba":true,"net.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"unsa.ba":true,"unbi.ba":true,"co.ba":true,"com.ba":true,"rs.ba":true,"bb":true,"biz.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gov.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"br":true,"adm.br":true,"adv.br":true,"agr.br":true,"am.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"can.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"coop.br":true,"ecn.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"flog.br":true,"fm.br":true,"fnd.br":true,"fot.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"gov.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jor.br":true,"jus.br":true,"lel.br":true,"mat.br":true,"med.br":true,"mil.br":true,"mus.br":true,"net.br":true,"nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"slg.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"vet.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"gov.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cx":true,"gov.cx":true,"*.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"*.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"org.gg":true,"net.gg":true,"sch.gg":true,"gov.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"gm":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"*.gt":true,"www.gt":false,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"net.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"co.id":true,"go.id":true,"mil.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"*.il":true,"im":true,"co.im":true,"ltd.co.im":true,"plc.co.im":true,"net.im":true,"gov.im":true,"org.im":true,"nic.im":true,"ac.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"agrigento.it":true,"ag.it":true,"alessandria.it":true,"al.it":true,"ancona.it":true,"an.it":true,"aosta.it":true,"aoste.it":true,"ao.it":true,"arezzo.it":true,"ar.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"ap.it":true,"asti.it":true,"at.it":true,"avellino.it":true,"av.it":true,"bari.it":true,"ba.it":true,"andria-barletta-trani.it":true,"andriabarlettatrani.it":true,"trani-barletta-andria.it":true,"tranibarlettaandria.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"andria-trani-barletta.it":true,"andriatranibarletta.it":true,"trani-andria-barletta.it":true,"traniandriabarletta.it":true,"bt.it":true,"belluno.it":true,"bl.it":true,"benevento.it":true,"bn.it":true,"bergamo.it":true,"bg.it":true,"biella.it":true,"bi.it":true,"bologna.it":true,"bo.it":true,"bolzano.it":true,"bozen.it":true,"balsan.it":true,"alto-adige.it":true,"altoadige.it":true,"suedtirol.it":true,"bz.it":true,"brescia.it":true,"bs.it":true,"brindisi.it":true,"br.it":true,"cagliari.it":true,"ca.it":true,"caltanissetta.it":true,"cl.it":true,"campobasso.it":true,"cb.it":true,"carboniaiglesias.it":true,"carbonia-iglesias.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"ci.it":true,"caserta.it":true,"ce.it":true,"catania.it":true,"ct.it":true,"catanzaro.it":true,"cz.it":true,"chieti.it":true,"ch.it":true,"como.it":true,"co.it":true,"cosenza.it":true,"cs.it":true,"cremona.it":true,"cr.it":true,"crotone.it":true,"kr.it":true,"cuneo.it":true,"cn.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"ogliastra.it":true,"og.it":true,"enna.it":true,"en.it":true,"ferrara.it":true,"fe.it":true,"fermo.it":true,"fm.it":true,"firenze.it":true,"florence.it":true,"fi.it":true,"foggia.it":true,"fg.it":true,"forli-cesena.it":true,"forlicesena.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"fc.it":true,"frosinone.it":true,"fr.it":true,"genova.it":true,"genoa.it":true,"ge.it":true,"gorizia.it":true,"go.it":true,"grosseto.it":true,"gr.it":true,"imperia.it":true,"im.it":true,"isernia.it":true,"is.it":true,"laquila.it":true,"aquila.it":true,"aq.it":true,"la-spezia.it":true,"laspezia.it":true,"sp.it":true,"latina.it":true,"lt.it":true,"lecce.it":true,"le.it":true,"lecco.it":true,"lc.it":true,"livorno.it":true,"li.it":true,"lodi.it":true,"lo.it":true,"lucca.it":true,"lu.it":true,"macerata.it":true,"mc.it":true,"mantova.it":true,"mn.it":true,"massa-carrara.it":true,"massacarrara.it":true,"carrara-massa.it":true,"carraramassa.it":true,"ms.it":true,"matera.it":true,"mt.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"vs.it":true,"messina.it":true,"me.it":true,"milano.it":true,"milan.it":true,"mi.it":true,"modena.it":true,"mo.it":true,"monza.it":true,"monza-brianza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"monza-e-della-brianza.it":true,"mb.it":true,"napoli.it":true,"naples.it":true,"na.it":true,"novara.it":true,"no.it":true,"nuoro.it":true,"nu.it":true,"oristano.it":true,"or.it":true,"padova.it":true,"padua.it":true,"pd.it":true,"palermo.it":true,"pa.it":true,"parma.it":true,"pr.it":true,"pavia.it":true,"pv.it":true,"perugia.it":true,"pg.it":true,"pescara.it":true,"pe.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"pu.it":true,"piacenza.it":true,"pc.it":true,"pisa.it":true,"pi.it":true,"pistoia.it":true,"pt.it":true,"pordenone.it":true,"pn.it":true,"potenza.it":true,"pz.it":true,"prato.it":true,"po.it":true,"ragusa.it":true,"rg.it":true,"ravenna.it":true,"ra.it":true,"reggio-calabria.it":true,"reggiocalabria.it":true,"rc.it":true,"reggio-emilia.it":true,"reggioemilia.it":true,"re.it":true,"rieti.it":true,"ri.it":true,"rimini.it":true,"rn.it":true,"roma.it":true,"rome.it":true,"rm.it":true,"rovigo.it":true,"ro.it":true,"salerno.it":true,"sa.it":true,"sassari.it":true,"ss.it":true,"savona.it":true,"sv.it":true,"siena.it":true,"si.it":true,"siracusa.it":true,"sr.it":true,"sondrio.it":true,"so.it":true,"taranto.it":true,"ta.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"ot.it":true,"teramo.it":true,"te.it":true,"terni.it":true,"tr.it":true,"torino.it":true,"turin.it":true,"to.it":true,"trapani.it":true,"tp.it":true,"trento.it":true,"trentino.it":true,"tn.it":true,"treviso.it":true,"tv.it":true,"trieste.it":true,"ts.it":true,"udine.it":true,"ud.it":true,"varese.it":true,"va.it":true,"venezia.it":true,"venice.it":true,"ve.it":true,"verbania.it":true,"vb.it":true,"vercelli.it":true,"vc.it":true,"verona.it":true,"vr.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vv.it":true,"vicenza.it":true,"vi.it":true,"viterbo.it":true,"vt.it":true,"je":true,"co.je":true,"org.je":true,"net.je":true,"sch.je":true,"gov.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"*.aichi.jp":true,"*.akita.jp":true,"*.aomori.jp":true,"*.chiba.jp":true,"*.ehime.jp":true,"*.fukui.jp":true,"*.fukuoka.jp":true,"*.fukushima.jp":true,"*.gifu.jp":true,"*.gunma.jp":true,"*.hiroshima.jp":true,"*.hokkaido.jp":true,"*.hyogo.jp":true,"*.ibaraki.jp":true,"*.ishikawa.jp":true,"*.iwate.jp":true,"*.kagawa.jp":true,"*.kagoshima.jp":true,"*.kanagawa.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.kochi.jp":true,"*.kumamoto.jp":true,"*.kyoto.jp":true,"*.mie.jp":true,"*.miyagi.jp":true,"*.miyazaki.jp":true,"*.nagano.jp":true,"*.nagasaki.jp":true,"*.nagoya.jp":true,"*.nara.jp":true,"*.niigata.jp":true,"*.oita.jp":true,"*.okayama.jp":true,"*.okinawa.jp":true,"*.osaka.jp":true,"*.saga.jp":true,"*.saitama.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.shiga.jp":true,"*.shimane.jp":true,"*.shizuoka.jp":true,"*.tochigi.jp":true,"*.tokushima.jp":true,"*.tokyo.jp":true,"*.tottori.jp":true,"*.toyama.jp":true,"*.wakayama.jp":true,"*.yamagata.jp":true,"*.yamaguchi.jp":true,"*.yamanashi.jp":true,"*.yokohama.jp":true,"metro.tokyo.jp":false,"pref.aichi.jp":false,"pref.akita.jp":false,"pref.aomori.jp":false,"pref.chiba.jp":false,"pref.ehime.jp":false,"pref.fukui.jp":false,"pref.fukuoka.jp":false,"pref.fukushima.jp":false,"pref.gifu.jp":false,"pref.gunma.jp":false,"pref.hiroshima.jp":false,"pref.hokkaido.jp":false,"pref.hyogo.jp":false,"pref.ibaraki.jp":false,"pref.ishikawa.jp":false,"pref.iwate.jp":false,"pref.kagawa.jp":false,"pref.kagoshima.jp":false,"pref.kanagawa.jp":false,"pref.kochi.jp":false,"pref.kumamoto.jp":false,"pref.kyoto.jp":false,"pref.mie.jp":false,"pref.miyagi.jp":false,"pref.miyazaki.jp":false,"pref.nagano.jp":false,"pref.nagasaki.jp":false,"pref.nara.jp":false,"pref.niigata.jp":false,"pref.oita.jp":false,"pref.okayama.jp":false,"pref.okinawa.jp":false,"pref.osaka.jp":false,"pref.saga.jp":false,"pref.saitama.jp":false,"pref.shiga.jp":false,"pref.shimane.jp":false,"pref.shizuoka.jp":false,"pref.tochigi.jp":false,"pref.tokushima.jp":false,"pref.tottori.jp":false,"pref.toyama.jp":false,"pref.wakayama.jp":false,"pref.yamagata.jp":false,"pref.yamaguchi.jp":false,"pref.yamanashi.jp":false,"city.chiba.jp":false,"city.fukuoka.jp":false,"city.hiroshima.jp":false,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.kyoto.jp":false,"city.nagoya.jp":false,"city.niigata.jp":false,"city.okayama.jp":false,"city.osaka.jp":false,"city.saitama.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.shizuoka.jp":false,"city.yokohama.jp":false,"*.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"*.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"*.mz":true,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ac.ng":true,"com.ng":true,"edu.ng":true,"gov.ng":true,"net.ng":true,"org.ng":true,"*.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"*.nz":true,"*.om":true,"mediaphone.om":false,"nawrastelecom.om":false,"nawras.om":false,"omanmobile.om":false,"omanpost.om":false,"omantel.om":false,"rakpetroleum.om":false,"siemens.om":false,"songfest.om":false,"statecouncil.om":false,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"com.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"info.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"net.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"org.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"6bone.pl":true,"art.pl":true,"mbone.pl":true,"gov.pl":true,"uw.gov.pl":true,"um.gov.pl":true,"ug.gov.pl":true,"upow.gov.pl":true,"starostwo.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"po.gov.pl":true,"pa.gov.pl":true,"ngo.pl":true,"irc.pl":true,"usenet.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"siedlce.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"waw.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aca.pro":true,"bar.pro":true,"cpa.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"eng.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"*.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"com.re":true,"asso.re":true,"nom.re":true,"ro":true,"com.ro":true,"org.ro":true,"tm.ro":true,"nt.ro":true,"nom.ro":true,"info.ro":true,"rec.ro":true,"arts.ro":true,"firm.ro":true,"store.ro":true,"www.ro":true,"rs":true,"co.rs":true,"org.rs":true,"edu.rs":true,"ac.rs":true,"gov.rs":true,"in.rs":true,"ru":true,"ac.ru":true,"com.ru":true,"edu.ru":true,"int.ru":true,"net.ru":true,"org.ru":true,"pp.ru":true,"adygeya.ru":true,"altai.ru":true,"amur.ru":true,"arkhangelsk.ru":true,"astrakhan.ru":true,"bashkiria.ru":true,"belgorod.ru":true,"bir.ru":true,"bryansk.ru":true,"buryatia.ru":true,"cbg.ru":true,"chel.ru":true,"chelyabinsk.ru":true,"chita.ru":true,"chukotka.ru":true,"chuvashia.ru":true,"dagestan.ru":true,"dudinka.ru":true,"e-burg.ru":true,"grozny.ru":true,"irkutsk.ru":true,"ivanovo.ru":true,"izhevsk.ru":true,"jar.ru":true,"joshkar-ola.ru":true,"kalmykia.ru":true,"kaluga.ru":true,"kamchatka.ru":true,"karelia.ru":true,"kazan.ru":true,"kchr.ru":true,"kemerovo.ru":true,"khabarovsk.ru":true,"khakassia.ru":true,"khv.ru":true,"kirov.ru":true,"koenig.ru":true,"komi.ru":true,"kostroma.ru":true,"krasnoyarsk.ru":true,"kuban.ru":true,"kurgan.ru":true,"kursk.ru":true,"lipetsk.ru":true,"magadan.ru":true,"mari.ru":true,"mari-el.ru":true,"marine.ru":true,"mordovia.ru":true,"mosreg.ru":true,"msk.ru":true,"murmansk.ru":true,"nalchik.ru":true,"nnov.ru":true,"nov.ru":true,"novosibirsk.ru":true,"nsk.ru":true,"omsk.ru":true,"orenburg.ru":true,"oryol.ru":true,"palana.ru":true,"penza.ru":true,"perm.ru":true,"pskov.ru":true,"ptz.ru":true,"rnd.ru":true,"ryazan.ru":true,"sakhalin.ru":true,"samara.ru":true,"saratov.ru":true,"simbirsk.ru":true,"smolensk.ru":true,"spb.ru":true,"stavropol.ru":true,"stv.ru":true,"surgut.ru":true,"tambov.ru":true,"tatarstan.ru":true,"tom.ru":true,"tomsk.ru":true,"tsaritsyn.ru":true,"tsk.ru":true,"tula.ru":true,"tuva.ru":true,"tver.ru":true,"tyumen.ru":true,"udm.ru":true,"udmurtia.ru":true,"ulan-ude.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"vladivostok.ru":true,"volgograd.ru":true,"vologda.ru":true,"voronezh.ru":true,"vrn.ru":true,"vyatka.ru":true,"yakutia.ru":true,"yamal.ru":true,"yaroslavl.ru":true,"yekaterinburg.ru":true,"yuzhno-sakhalinsk.ru":true,"amursk.ru":true,"baikal.ru":true,"cmw.ru":true,"fareast.ru":true,"jamal.ru":true,"kms.ru":true,"k-uralsk.ru":true,"kustanai.ru":true,"kuzbass.ru":true,"magnitka.ru":true,"mytis.ru":true,"nakhodka.ru":true,"nkz.ru":true,"norilsk.ru":true,"oskol.ru":true,"pyatigorsk.ru":true,"rubtsovsk.ru":true,"snz.ru":true,"syzran.ru":true,"vdonsk.ru":true,"zgrad.ru":true,"gov.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"sshn.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"si":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"*.sv":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"*.tr":true,"nic.tr":false,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"ac.tz":true,"co.tz":true,"go.tz":true,"mil.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"chernigov.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"ks.ua":true,"kv.ua":true,"lg.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lviv.ua":true,"mk.ua":true,"nikolaev.ua":true,"od.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rovno.ua":true,"rv.ua":true,"sebastopol.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vn.ua":true,"zaporizhzhe.ua":true,"zp.ua":true,"zhitomir.ua":true,"zt.ua":true,"co.ua":true,"pp.ua":true,"ug":true,"co.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"or.ug":true,"*.uk":true,"*.sch.uk":true,"bl.uk":false,"british-library.uk":false,"icnet.uk":false,"jet.uk":false,"mod.uk":false,"nel.uk":false,"nhs.uk":false,"nic.uk":false,"nls.uk":false,"national-library-scotland.uk":false,"parliament.uk":false,"police.uk":false,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.nd.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.sd.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wv.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.de.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wv.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"*.uy":true,"uz":true,"com.uz":true,"co.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"*.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--54b7fta0cc":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--node":true,"xn--j6w193g":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--mgb9awbf":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"*.za":true,"*.zm":true,"*.zw":true,"biz.at":true,"info.at":true,"priv.at":true,"co.ca":true,"ar.com":true,"br.com":true,"cn.com":true,"de.com":true,"eu.com":true,"gb.com":true,"gr.com":true,"hu.com":true,"jpn.com":true,"kr.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"uk.com":true,"us.com":true,"uy.com":true,"za.com":true,"gb.net":true,"jp.net":true,"se.net":true,"uk.net":true,"ae.org":true,"us.org":true,"com.de":true,"operaunite.com":true,"appspot.com":true,"iki.fi":true,"c.la":true,"za.net":true,"za.org":true,"co.nl":true,"co.no":true,"co.pl":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true});
+{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"marketplace.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"taxi.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"an":true,"com.an":true,"net.an":true,"org.an":true,"edu.an":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"ar":true,"com.ar":true,"edu.ar":true,"gob.ar":true,"gov.ar":true,"int.ar":true,"mil.ar":true,"net.ar":true,"org.ar":true,"tur.ar":true,"arpa":true,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"au":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"org.ba":true,"net.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"unsa.ba":true,"unbi.ba":true,"co.ba":true,"com.ba":true,"rs.ba":true,"bb":true,"biz.bb":true,"co.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"tv.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gov.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"br":true,"adm.br":true,"adv.br":true,"agr.br":true,"am.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"coop.br":true,"ecn.br":true,"eco.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"flog.br":true,"fm.br":true,"fnd.br":true,"fot.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"gov.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jor.br":true,"jus.br":true,"leg.br":true,"lel.br":true,"mat.br":true,"med.br":true,"mil.br":true,"mp.br":true,"mus.br":true,"net.br":true,"*.nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"slg.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"vet.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bv":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"co.cm":true,"com.cm":true,"gov.cm":true,"net.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cw":true,"com.cw":true,"edu.cw":true,"net.cw":true,"org.cw":true,"cx":true,"gov.cx":true,"*.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"et":true,"com.et":true,"gov.et":true,"org.et":true,"edu.et":true,"biz.et":true,"name.et":true,"info.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gb":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"net.gg":true,"org.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"gm":true,"gn":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"gt":true,"com.gt":true,"edu.gt":true,"gob.gt":true,"ind.gt":true,"mil.gt":true,"net.gt":true,"org.gt":true,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"net.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"biz.id":true,"co.id":true,"desa.id":true,"go.id":true,"mil.id":true,"my.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"*.il":true,"im":true,"ac.im":true,"co.im":true,"com.im":true,"ltd.co.im":true,"net.im":true,"org.im":true,"plc.co.im":true,"tt.im":true,"tv.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"abr.it":true,"abruzzo.it":true,"aosta-valley.it":true,"aostavalley.it":true,"bas.it":true,"basilicata.it":true,"cal.it":true,"calabria.it":true,"cam.it":true,"campania.it":true,"emilia-romagna.it":true,"emiliaromagna.it":true,"emr.it":true,"friuli-v-giulia.it":true,"friuli-ve-giulia.it":true,"friuli-vegiulia.it":true,"friuli-venezia-giulia.it":true,"friuli-veneziagiulia.it":true,"friuli-vgiulia.it":true,"friuliv-giulia.it":true,"friulive-giulia.it":true,"friulivegiulia.it":true,"friulivenezia-giulia.it":true,"friuliveneziagiulia.it":true,"friulivgiulia.it":true,"fvg.it":true,"laz.it":true,"lazio.it":true,"lig.it":true,"liguria.it":true,"lom.it":true,"lombardia.it":true,"lombardy.it":true,"lucania.it":true,"mar.it":true,"marche.it":true,"mol.it":true,"molise.it":true,"piedmont.it":true,"piemonte.it":true,"pmn.it":true,"pug.it":true,"puglia.it":true,"sar.it":true,"sardegna.it":true,"sardinia.it":true,"sic.it":true,"sicilia.it":true,"sicily.it":true,"taa.it":true,"tos.it":true,"toscana.it":true,"trentino-a-adige.it":true,"trentino-aadige.it":true,"trentino-alto-adige.it":true,"trentino-altoadige.it":true,"trentino-s-tirol.it":true,"trentino-stirol.it":true,"trentino-sud-tirol.it":true,"trentino-sudtirol.it":true,"trentino-sued-tirol.it":true,"trentino-suedtirol.it":true,"trentinoa-adige.it":true,"trentinoaadige.it":true,"trentinoalto-adige.it":true,"trentinoaltoadige.it":true,"trentinos-tirol.it":true,"trentinostirol.it":true,"trentinosud-tirol.it":true,"trentinosudtirol.it":true,"trentinosued-tirol.it":true,"trentinosuedtirol.it":true,"tuscany.it":true,"umb.it":true,"umbria.it":true,"val-d-aosta.it":true,"val-daosta.it":true,"vald-aosta.it":true,"valdaosta.it":true,"valle-aosta.it":true,"valle-d-aosta.it":true,"valle-daosta.it":true,"valleaosta.it":true,"valled-aosta.it":true,"valledaosta.it":true,"vallee-aoste.it":true,"valleeaoste.it":true,"vao.it":true,"vda.it":true,"ven.it":true,"veneto.it":true,"ag.it":true,"agrigento.it":true,"al.it":true,"alessandria.it":true,"alto-adige.it":true,"altoadige.it":true,"an.it":true,"ancona.it":true,"andria-barletta-trani.it":true,"andria-trani-barletta.it":true,"andriabarlettatrani.it":true,"andriatranibarletta.it":true,"ao.it":true,"aosta.it":true,"aoste.it":true,"ap.it":true,"aq.it":true,"aquila.it":true,"ar.it":true,"arezzo.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"asti.it":true,"at.it":true,"av.it":true,"avellino.it":true,"ba.it":true,"balsan.it":true,"bari.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"belluno.it":true,"benevento.it":true,"bergamo.it":true,"bg.it":true,"bi.it":true,"biella.it":true,"bl.it":true,"bn.it":true,"bo.it":true,"bologna.it":true,"bolzano.it":true,"bozen.it":true,"br.it":true,"brescia.it":true,"brindisi.it":true,"bs.it":true,"bt.it":true,"bz.it":true,"ca.it":true,"cagliari.it":true,"caltanissetta.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"campobasso.it":true,"carbonia-iglesias.it":true,"carboniaiglesias.it":true,"carrara-massa.it":true,"carraramassa.it":true,"caserta.it":true,"catania.it":true,"catanzaro.it":true,"cb.it":true,"ce.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"ch.it":true,"chieti.it":true,"ci.it":true,"cl.it":true,"cn.it":true,"co.it":true,"como.it":true,"cosenza.it":true,"cr.it":true,"cremona.it":true,"crotone.it":true,"cs.it":true,"ct.it":true,"cuneo.it":true,"cz.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"en.it":true,"enna.it":true,"fc.it":true,"fe.it":true,"fermo.it":true,"ferrara.it":true,"fg.it":true,"fi.it":true,"firenze.it":true,"florence.it":true,"fm.it":true,"foggia.it":true,"forli-cesena.it":true,"forlicesena.it":true,"fr.it":true,"frosinone.it":true,"ge.it":true,"genoa.it":true,"genova.it":true,"go.it":true,"gorizia.it":true,"gr.it":true,"grosseto.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"im.it":true,"imperia.it":true,"is.it":true,"isernia.it":true,"kr.it":true,"la-spezia.it":true,"laquila.it":true,"laspezia.it":true,"latina.it":true,"lc.it":true,"le.it":true,"lecce.it":true,"lecco.it":true,"li.it":true,"livorno.it":true,"lo.it":true,"lodi.it":true,"lt.it":true,"lu.it":true,"lucca.it":true,"macerata.it":true,"mantova.it":true,"massa-carrara.it":true,"massacarrara.it":true,"matera.it":true,"mb.it":true,"mc.it":true,"me.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"messina.it":true,"mi.it":true,"milan.it":true,"milano.it":true,"mn.it":true,"mo.it":true,"modena.it":true,"monza-brianza.it":true,"monza-e-della-brianza.it":true,"monza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"ms.it":true,"mt.it":true,"na.it":true,"naples.it":true,"napoli.it":true,"no.it":true,"novara.it":true,"nu.it":true,"nuoro.it":true,"og.it":true,"ogliastra.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"or.it":true,"oristano.it":true,"ot.it":true,"pa.it":true,"padova.it":true,"padua.it":true,"palermo.it":true,"parma.it":true,"pavia.it":true,"pc.it":true,"pd.it":true,"pe.it":true,"perugia.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"pescara.it":true,"pg.it":true,"pi.it":true,"piacenza.it":true,"pisa.it":true,"pistoia.it":true,"pn.it":true,"po.it":true,"pordenone.it":true,"potenza.it":true,"pr.it":true,"prato.it":true,"pt.it":true,"pu.it":true,"pv.it":true,"pz.it":true,"ra.it":true,"ragusa.it":true,"ravenna.it":true,"rc.it":true,"re.it":true,"reggio-calabria.it":true,"reggio-emilia.it":true,"reggiocalabria.it":true,"reggioemilia.it":true,"rg.it":true,"ri.it":true,"rieti.it":true,"rimini.it":true,"rm.it":true,"rn.it":true,"ro.it":true,"roma.it":true,"rome.it":true,"rovigo.it":true,"sa.it":true,"salerno.it":true,"sassari.it":true,"savona.it":true,"si.it":true,"siena.it":true,"siracusa.it":true,"so.it":true,"sondrio.it":true,"sp.it":true,"sr.it":true,"ss.it":true,"suedtirol.it":true,"sv.it":true,"ta.it":true,"taranto.it":true,"te.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"teramo.it":true,"terni.it":true,"tn.it":true,"to.it":true,"torino.it":true,"tp.it":true,"tr.it":true,"trani-andria-barletta.it":true,"trani-barletta-andria.it":true,"traniandriabarletta.it":true,"tranibarlettaandria.it":true,"trapani.it":true,"trentino.it":true,"trento.it":true,"treviso.it":true,"trieste.it":true,"ts.it":true,"turin.it":true,"tv.it":true,"ud.it":true,"udine.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"va.it":true,"varese.it":true,"vb.it":true,"vc.it":true,"ve.it":true,"venezia.it":true,"venice.it":true,"verbania.it":true,"vercelli.it":true,"verona.it":true,"vi.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vicenza.it":true,"viterbo.it":true,"vr.it":true,"vs.it":true,"vt.it":true,"vv.it":true,"je":true,"co.je":true,"net.je":true,"org.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"aichi.jp":true,"akita.jp":true,"aomori.jp":true,"chiba.jp":true,"ehime.jp":true,"fukui.jp":true,"fukuoka.jp":true,"fukushima.jp":true,"gifu.jp":true,"gunma.jp":true,"hiroshima.jp":true,"hokkaido.jp":true,"hyogo.jp":true,"ibaraki.jp":true,"ishikawa.jp":true,"iwate.jp":true,"kagawa.jp":true,"kagoshima.jp":true,"kanagawa.jp":true,"kochi.jp":true,"kumamoto.jp":true,"kyoto.jp":true,"mie.jp":true,"miyagi.jp":true,"miyazaki.jp":true,"nagano.jp":true,"nagasaki.jp":true,"nara.jp":true,"niigata.jp":true,"oita.jp":true,"okayama.jp":true,"okinawa.jp":true,"osaka.jp":true,"saga.jp":true,"saitama.jp":true,"shiga.jp":true,"shimane.jp":true,"shizuoka.jp":true,"tochigi.jp":true,"tokushima.jp":true,"tokyo.jp":true,"tottori.jp":true,"toyama.jp":true,"wakayama.jp":true,"yamagata.jp":true,"yamaguchi.jp":true,"yamanashi.jp":true,"xn--4pvxs.jp":true,"xn--vgu402c.jp":true,"xn--c3s14m.jp":true,"xn--f6qx53a.jp":true,"xn--8pvr4u.jp":true,"xn--uist22h.jp":true,"xn--djrs72d6uy.jp":true,"xn--mkru45i.jp":true,"xn--0trq7p7nn.jp":true,"xn--8ltr62k.jp":true,"xn--2m4a15e.jp":true,"xn--efvn9s.jp":true,"xn--32vp30h.jp":true,"xn--4it797k.jp":true,"xn--1lqs71d.jp":true,"xn--5rtp49c.jp":true,"xn--5js045d.jp":true,"xn--ehqz56n.jp":true,"xn--1lqs03n.jp":true,"xn--qqqt11m.jp":true,"xn--kbrq7o.jp":true,"xn--pssu33l.jp":true,"xn--ntsq17g.jp":true,"xn--uisz3g.jp":true,"xn--6btw5a.jp":true,"xn--1ctwo.jp":true,"xn--6orx2r.jp":true,"xn--rht61e.jp":true,"xn--rht27z.jp":true,"xn--djty4k.jp":true,"xn--nit225k.jp":true,"xn--rht3d.jp":true,"xn--klty5x.jp":true,"xn--kltx9a.jp":true,"xn--kltp7d.jp":true,"xn--uuwu58a.jp":true,"xn--zbx025d.jp":true,"xn--ntso0iqx3a.jp":true,"xn--elqq16h.jp":true,"xn--4it168d.jp":true,"xn--klt787d.jp":true,"xn--rny31h.jp":true,"xn--7t0a264c.jp":true,"xn--5rtq34k.jp":true,"xn--k7yn95e.jp":true,"xn--tor131o.jp":true,"xn--d5qv7z876c.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.nagoya.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.yokohama.jp":true,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.nagoya.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.yokohama.jp":false,"aisai.aichi.jp":true,"ama.aichi.jp":true,"anjo.aichi.jp":true,"asuke.aichi.jp":true,"chiryu.aichi.jp":true,"chita.aichi.jp":true,"fuso.aichi.jp":true,"gamagori.aichi.jp":true,"handa.aichi.jp":true,"hazu.aichi.jp":true,"hekinan.aichi.jp":true,"higashiura.aichi.jp":true,"ichinomiya.aichi.jp":true,"inazawa.aichi.jp":true,"inuyama.aichi.jp":true,"isshiki.aichi.jp":true,"iwakura.aichi.jp":true,"kanie.aichi.jp":true,"kariya.aichi.jp":true,"kasugai.aichi.jp":true,"kira.aichi.jp":true,"kiyosu.aichi.jp":true,"komaki.aichi.jp":true,"konan.aichi.jp":true,"kota.aichi.jp":true,"mihama.aichi.jp":true,"miyoshi.aichi.jp":true,"nishio.aichi.jp":true,"nisshin.aichi.jp":true,"obu.aichi.jp":true,"oguchi.aichi.jp":true,"oharu.aichi.jp":true,"okazaki.aichi.jp":true,"owariasahi.aichi.jp":true,"seto.aichi.jp":true,"shikatsu.aichi.jp":true,"shinshiro.aichi.jp":true,"shitara.aichi.jp":true,"tahara.aichi.jp":true,"takahama.aichi.jp":true,"tobishima.aichi.jp":true,"toei.aichi.jp":true,"togo.aichi.jp":true,"tokai.aichi.jp":true,"tokoname.aichi.jp":true,"toyoake.aichi.jp":true,"toyohashi.aichi.jp":true,"toyokawa.aichi.jp":true,"toyone.aichi.jp":true,"toyota.aichi.jp":true,"tsushima.aichi.jp":true,"yatomi.aichi.jp":true,"akita.akita.jp":true,"daisen.akita.jp":true,"fujisato.akita.jp":true,"gojome.akita.jp":true,"hachirogata.akita.jp":true,"happou.akita.jp":true,"higashinaruse.akita.jp":true,"honjo.akita.jp":true,"honjyo.akita.jp":true,"ikawa.akita.jp":true,"kamikoani.akita.jp":true,"kamioka.akita.jp":true,"katagami.akita.jp":true,"kazuno.akita.jp":true,"kitaakita.akita.jp":true,"kosaka.akita.jp":true,"kyowa.akita.jp":true,"misato.akita.jp":true,"mitane.akita.jp":true,"moriyoshi.akita.jp":true,"nikaho.akita.jp":true,"noshiro.akita.jp":true,"odate.akita.jp":true,"oga.akita.jp":true,"ogata.akita.jp":true,"semboku.akita.jp":true,"yokote.akita.jp":true,"yurihonjo.akita.jp":true,"aomori.aomori.jp":true,"gonohe.aomori.jp":true,"hachinohe.aomori.jp":true,"hashikami.aomori.jp":true,"hiranai.aomori.jp":true,"hirosaki.aomori.jp":true,"itayanagi.aomori.jp":true,"kuroishi.aomori.jp":true,"misawa.aomori.jp":true,"mutsu.aomori.jp":true,"nakadomari.aomori.jp":true,"noheji.aomori.jp":true,"oirase.aomori.jp":true,"owani.aomori.jp":true,"rokunohe.aomori.jp":true,"sannohe.aomori.jp":true,"shichinohe.aomori.jp":true,"shingo.aomori.jp":true,"takko.aomori.jp":true,"towada.aomori.jp":true,"tsugaru.aomori.jp":true,"tsuruta.aomori.jp":true,"abiko.chiba.jp":true,"asahi.chiba.jp":true,"chonan.chiba.jp":true,"chosei.chiba.jp":true,"choshi.chiba.jp":true,"chuo.chiba.jp":true,"funabashi.chiba.jp":true,"futtsu.chiba.jp":true,"hanamigawa.chiba.jp":true,"ichihara.chiba.jp":true,"ichikawa.chiba.jp":true,"ichinomiya.chiba.jp":true,"inzai.chiba.jp":true,"isumi.chiba.jp":true,"kamagaya.chiba.jp":true,"kamogawa.chiba.jp":true,"kashiwa.chiba.jp":true,"katori.chiba.jp":true,"katsuura.chiba.jp":true,"kimitsu.chiba.jp":true,"kisarazu.chiba.jp":true,"kozaki.chiba.jp":true,"kujukuri.chiba.jp":true,"kyonan.chiba.jp":true,"matsudo.chiba.jp":true,"midori.chiba.jp":true,"mihama.chiba.jp":true,"minamiboso.chiba.jp":true,"mobara.chiba.jp":true,"mutsuzawa.chiba.jp":true,"nagara.chiba.jp":true,"nagareyama.chiba.jp":true,"narashino.chiba.jp":true,"narita.chiba.jp":true,"noda.chiba.jp":true,"oamishirasato.chiba.jp":true,"omigawa.chiba.jp":true,"onjuku.chiba.jp":true,"otaki.chiba.jp":true,"sakae.chiba.jp":true,"sakura.chiba.jp":true,"shimofusa.chiba.jp":true,"shirako.chiba.jp":true,"shiroi.chiba.jp":true,"shisui.chiba.jp":true,"sodegaura.chiba.jp":true,"sosa.chiba.jp":true,"tako.chiba.jp":true,"tateyama.chiba.jp":true,"togane.chiba.jp":true,"tohnosho.chiba.jp":true,"tomisato.chiba.jp":true,"urayasu.chiba.jp":true,"yachimata.chiba.jp":true,"yachiyo.chiba.jp":true,"yokaichiba.chiba.jp":true,"yokoshibahikari.chiba.jp":true,"yotsukaido.chiba.jp":true,"ainan.ehime.jp":true,"honai.ehime.jp":true,"ikata.ehime.jp":true,"imabari.ehime.jp":true,"iyo.ehime.jp":true,"kamijima.ehime.jp":true,"kihoku.ehime.jp":true,"kumakogen.ehime.jp":true,"masaki.ehime.jp":true,"matsuno.ehime.jp":true,"matsuyama.ehime.jp":true,"namikata.ehime.jp":true,"niihama.ehime.jp":true,"ozu.ehime.jp":true,"saijo.ehime.jp":true,"seiyo.ehime.jp":true,"shikokuchuo.ehime.jp":true,"tobe.ehime.jp":true,"toon.ehime.jp":true,"uchiko.ehime.jp":true,"uwajima.ehime.jp":true,"yawatahama.ehime.jp":true,"echizen.fukui.jp":true,"eiheiji.fukui.jp":true,"fukui.fukui.jp":true,"ikeda.fukui.jp":true,"katsuyama.fukui.jp":true,"mihama.fukui.jp":true,"minamiechizen.fukui.jp":true,"obama.fukui.jp":true,"ohi.fukui.jp":true,"ono.fukui.jp":true,"sabae.fukui.jp":true,"sakai.fukui.jp":true,"takahama.fukui.jp":true,"tsuruga.fukui.jp":true,"wakasa.fukui.jp":true,"ashiya.fukuoka.jp":true,"buzen.fukuoka.jp":true,"chikugo.fukuoka.jp":true,"chikuho.fukuoka.jp":true,"chikujo.fukuoka.jp":true,"chikushino.fukuoka.jp":true,"chikuzen.fukuoka.jp":true,"chuo.fukuoka.jp":true,"dazaifu.fukuoka.jp":true,"fukuchi.fukuoka.jp":true,"hakata.fukuoka.jp":true,"higashi.fukuoka.jp":true,"hirokawa.fukuoka.jp":true,"hisayama.fukuoka.jp":true,"iizuka.fukuoka.jp":true,"inatsuki.fukuoka.jp":true,"kaho.fukuoka.jp":true,"kasuga.fukuoka.jp":true,"kasuya.fukuoka.jp":true,"kawara.fukuoka.jp":true,"keisen.fukuoka.jp":true,"koga.fukuoka.jp":true,"kurate.fukuoka.jp":true,"kurogi.fukuoka.jp":true,"kurume.fukuoka.jp":true,"minami.fukuoka.jp":true,"miyako.fukuoka.jp":true,"miyama.fukuoka.jp":true,"miyawaka.fukuoka.jp":true,"mizumaki.fukuoka.jp":true,"munakata.fukuoka.jp":true,"nakagawa.fukuoka.jp":true,"nakama.fukuoka.jp":true,"nishi.fukuoka.jp":true,"nogata.fukuoka.jp":true,"ogori.fukuoka.jp":true,"okagaki.fukuoka.jp":true,"okawa.fukuoka.jp":true,"oki.fukuoka.jp":true,"omuta.fukuoka.jp":true,"onga.fukuoka.jp":true,"onojo.fukuoka.jp":true,"oto.fukuoka.jp":true,"saigawa.fukuoka.jp":true,"sasaguri.fukuoka.jp":true,"shingu.fukuoka.jp":true,"shinyoshitomi.fukuoka.jp":true,"shonai.fukuoka.jp":true,"soeda.fukuoka.jp":true,"sue.fukuoka.jp":true,"tachiarai.fukuoka.jp":true,"tagawa.fukuoka.jp":true,"takata.fukuoka.jp":true,"toho.fukuoka.jp":true,"toyotsu.fukuoka.jp":true,"tsuiki.fukuoka.jp":true,"ukiha.fukuoka.jp":true,"umi.fukuoka.jp":true,"usui.fukuoka.jp":true,"yamada.fukuoka.jp":true,"yame.fukuoka.jp":true,"yanagawa.fukuoka.jp":true,"yukuhashi.fukuoka.jp":true,"aizubange.fukushima.jp":true,"aizumisato.fukushima.jp":true,"aizuwakamatsu.fukushima.jp":true,"asakawa.fukushima.jp":true,"bandai.fukushima.jp":true,"date.fukushima.jp":true,"fukushima.fukushima.jp":true,"furudono.fukushima.jp":true,"futaba.fukushima.jp":true,"hanawa.fukushima.jp":true,"higashi.fukushima.jp":true,"hirata.fukushima.jp":true,"hirono.fukushima.jp":true,"iitate.fukushima.jp":true,"inawashiro.fukushima.jp":true,"ishikawa.fukushima.jp":true,"iwaki.fukushima.jp":true,"izumizaki.fukushima.jp":true,"kagamiishi.fukushima.jp":true,"kaneyama.fukushima.jp":true,"kawamata.fukushima.jp":true,"kitakata.fukushima.jp":true,"kitashiobara.fukushima.jp":true,"koori.fukushima.jp":true,"koriyama.fukushima.jp":true,"kunimi.fukushima.jp":true,"miharu.fukushima.jp":true,"mishima.fukushima.jp":true,"namie.fukushima.jp":true,"nango.fukushima.jp":true,"nishiaizu.fukushima.jp":true,"nishigo.fukushima.jp":true,"okuma.fukushima.jp":true,"omotego.fukushima.jp":true,"ono.fukushima.jp":true,"otama.fukushima.jp":true,"samegawa.fukushima.jp":true,"shimogo.fukushima.jp":true,"shirakawa.fukushima.jp":true,"showa.fukushima.jp":true,"soma.fukushima.jp":true,"sukagawa.fukushima.jp":true,"taishin.fukushima.jp":true,"tamakawa.fukushima.jp":true,"tanagura.fukushima.jp":true,"tenei.fukushima.jp":true,"yabuki.fukushima.jp":true,"yamato.fukushima.jp":true,"yamatsuri.fukushima.jp":true,"yanaizu.fukushima.jp":true,"yugawa.fukushima.jp":true,"anpachi.gifu.jp":true,"ena.gifu.jp":true,"gifu.gifu.jp":true,"ginan.gifu.jp":true,"godo.gifu.jp":true,"gujo.gifu.jp":true,"hashima.gifu.jp":true,"hichiso.gifu.jp":true,"hida.gifu.jp":true,"higashishirakawa.gifu.jp":true,"ibigawa.gifu.jp":true,"ikeda.gifu.jp":true,"kakamigahara.gifu.jp":true,"kani.gifu.jp":true,"kasahara.gifu.jp":true,"kasamatsu.gifu.jp":true,"kawaue.gifu.jp":true,"kitagata.gifu.jp":true,"mino.gifu.jp":true,"minokamo.gifu.jp":true,"mitake.gifu.jp":true,"mizunami.gifu.jp":true,"motosu.gifu.jp":true,"nakatsugawa.gifu.jp":true,"ogaki.gifu.jp":true,"sakahogi.gifu.jp":true,"seki.gifu.jp":true,"sekigahara.gifu.jp":true,"shirakawa.gifu.jp":true,"tajimi.gifu.jp":true,"takayama.gifu.jp":true,"tarui.gifu.jp":true,"toki.gifu.jp":true,"tomika.gifu.jp":true,"wanouchi.gifu.jp":true,"yamagata.gifu.jp":true,"yaotsu.gifu.jp":true,"yoro.gifu.jp":true,"annaka.gunma.jp":true,"chiyoda.gunma.jp":true,"fujioka.gunma.jp":true,"higashiagatsuma.gunma.jp":true,"isesaki.gunma.jp":true,"itakura.gunma.jp":true,"kanna.gunma.jp":true,"kanra.gunma.jp":true,"katashina.gunma.jp":true,"kawaba.gunma.jp":true,"kiryu.gunma.jp":true,"kusatsu.gunma.jp":true,"maebashi.gunma.jp":true,"meiwa.gunma.jp":true,"midori.gunma.jp":true,"minakami.gunma.jp":true,"naganohara.gunma.jp":true,"nakanojo.gunma.jp":true,"nanmoku.gunma.jp":true,"numata.gunma.jp":true,"oizumi.gunma.jp":true,"ora.gunma.jp":true,"ota.gunma.jp":true,"shibukawa.gunma.jp":true,"shimonita.gunma.jp":true,"shinto.gunma.jp":true,"showa.gunma.jp":true,"takasaki.gunma.jp":true,"takayama.gunma.jp":true,"tamamura.gunma.jp":true,"tatebayashi.gunma.jp":true,"tomioka.gunma.jp":true,"tsukiyono.gunma.jp":true,"tsumagoi.gunma.jp":true,"ueno.gunma.jp":true,"yoshioka.gunma.jp":true,"asaminami.hiroshima.jp":true,"daiwa.hiroshima.jp":true,"etajima.hiroshima.jp":true,"fuchu.hiroshima.jp":true,"fukuyama.hiroshima.jp":true,"hatsukaichi.hiroshima.jp":true,"higashihiroshima.hiroshima.jp":true,"hongo.hiroshima.jp":true,"jinsekikogen.hiroshima.jp":true,"kaita.hiroshima.jp":true,"kui.hiroshima.jp":true,"kumano.hiroshima.jp":true,"kure.hiroshima.jp":true,"mihara.hiroshima.jp":true,"miyoshi.hiroshima.jp":true,"naka.hiroshima.jp":true,"onomichi.hiroshima.jp":true,"osakikamijima.hiroshima.jp":true,"otake.hiroshima.jp":true,"saka.hiroshima.jp":true,"sera.hiroshima.jp":true,"seranishi.hiroshima.jp":true,"shinichi.hiroshima.jp":true,"shobara.hiroshima.jp":true,"takehara.hiroshima.jp":true,"abashiri.hokkaido.jp":true,"abira.hokkaido.jp":true,"aibetsu.hokkaido.jp":true,"akabira.hokkaido.jp":true,"akkeshi.hokkaido.jp":true,"asahikawa.hokkaido.jp":true,"ashibetsu.hokkaido.jp":true,"ashoro.hokkaido.jp":true,"assabu.hokkaido.jp":true,"atsuma.hokkaido.jp":true,"bibai.hokkaido.jp":true,"biei.hokkaido.jp":true,"bifuka.hokkaido.jp":true,"bihoro.hokkaido.jp":true,"biratori.hokkaido.jp":true,"chippubetsu.hokkaido.jp":true,"chitose.hokkaido.jp":true,"date.hokkaido.jp":true,"ebetsu.hokkaido.jp":true,"embetsu.hokkaido.jp":true,"eniwa.hokkaido.jp":true,"erimo.hokkaido.jp":true,"esan.hokkaido.jp":true,"esashi.hokkaido.jp":true,"fukagawa.hokkaido.jp":true,"fukushima.hokkaido.jp":true,"furano.hokkaido.jp":true,"furubira.hokkaido.jp":true,"haboro.hokkaido.jp":true,"hakodate.hokkaido.jp":true,"hamatonbetsu.hokkaido.jp":true,"hidaka.hokkaido.jp":true,"higashikagura.hokkaido.jp":true,"higashikawa.hokkaido.jp":true,"hiroo.hokkaido.jp":true,"hokuryu.hokkaido.jp":true,"hokuto.hokkaido.jp":true,"honbetsu.hokkaido.jp":true,"horokanai.hokkaido.jp":true,"horonobe.hokkaido.jp":true,"ikeda.hokkaido.jp":true,"imakane.hokkaido.jp":true,"ishikari.hokkaido.jp":true,"iwamizawa.hokkaido.jp":true,"iwanai.hokkaido.jp":true,"kamifurano.hokkaido.jp":true,"kamikawa.hokkaido.jp":true,"kamishihoro.hokkaido.jp":true,"kamisunagawa.hokkaido.jp":true,"kamoenai.hokkaido.jp":true,"kayabe.hokkaido.jp":true,"kembuchi.hokkaido.jp":true,"kikonai.hokkaido.jp":true,"kimobetsu.hokkaido.jp":true,"kitahiroshima.hokkaido.jp":true,"kitami.hokkaido.jp":true,"kiyosato.hokkaido.jp":true,"koshimizu.hokkaido.jp":true,"kunneppu.hokkaido.jp":true,"kuriyama.hokkaido.jp":true,"kuromatsunai.hokkaido.jp":true,"kushiro.hokkaido.jp":true,"kutchan.hokkaido.jp":true,"kyowa.hokkaido.jp":true,"mashike.hokkaido.jp":true,"matsumae.hokkaido.jp":true,"mikasa.hokkaido.jp":true,"minamifurano.hokkaido.jp":true,"mombetsu.hokkaido.jp":true,"moseushi.hokkaido.jp":true,"mukawa.hokkaido.jp":true,"muroran.hokkaido.jp":true,"naie.hokkaido.jp":true,"nakagawa.hokkaido.jp":true,"nakasatsunai.hokkaido.jp":true,"nakatombetsu.hokkaido.jp":true,"nanae.hokkaido.jp":true,"nanporo.hokkaido.jp":true,"nayoro.hokkaido.jp":true,"nemuro.hokkaido.jp":true,"niikappu.hokkaido.jp":true,"niki.hokkaido.jp":true,"nishiokoppe.hokkaido.jp":true,"noboribetsu.hokkaido.jp":true,"numata.hokkaido.jp":true,"obihiro.hokkaido.jp":true,"obira.hokkaido.jp":true,"oketo.hokkaido.jp":true,"okoppe.hokkaido.jp":true,"otaru.hokkaido.jp":true,"otobe.hokkaido.jp":true,"otofuke.hokkaido.jp":true,"otoineppu.hokkaido.jp":true,"oumu.hokkaido.jp":true,"ozora.hokkaido.jp":true,"pippu.hokkaido.jp":true,"rankoshi.hokkaido.jp":true,"rebun.hokkaido.jp":true,"rikubetsu.hokkaido.jp":true,"rishiri.hokkaido.jp":true,"rishirifuji.hokkaido.jp":true,"saroma.hokkaido.jp":true,"sarufutsu.hokkaido.jp":true,"shakotan.hokkaido.jp":true,"shari.hokkaido.jp":true,"shibecha.hokkaido.jp":true,"shibetsu.hokkaido.jp":true,"shikabe.hokkaido.jp":true,"shikaoi.hokkaido.jp":true,"shimamaki.hokkaido.jp":true,"shimizu.hokkaido.jp":true,"shimokawa.hokkaido.jp":true,"shinshinotsu.hokkaido.jp":true,"shintoku.hokkaido.jp":true,"shiranuka.hokkaido.jp":true,"shiraoi.hokkaido.jp":true,"shiriuchi.hokkaido.jp":true,"sobetsu.hokkaido.jp":true,"sunagawa.hokkaido.jp":true,"taiki.hokkaido.jp":true,"takasu.hokkaido.jp":true,"takikawa.hokkaido.jp":true,"takinoue.hokkaido.jp":true,"teshikaga.hokkaido.jp":true,"tobetsu.hokkaido.jp":true,"tohma.hokkaido.jp":true,"tomakomai.hokkaido.jp":true,"tomari.hokkaido.jp":true,"toya.hokkaido.jp":true,"toyako.hokkaido.jp":true,"toyotomi.hokkaido.jp":true,"toyoura.hokkaido.jp":true,"tsubetsu.hokkaido.jp":true,"tsukigata.hokkaido.jp":true,"urakawa.hokkaido.jp":true,"urausu.hokkaido.jp":true,"uryu.hokkaido.jp":true,"utashinai.hokkaido.jp":true,"wakkanai.hokkaido.jp":true,"wassamu.hokkaido.jp":true,"yakumo.hokkaido.jp":true,"yoichi.hokkaido.jp":true,"aioi.hyogo.jp":true,"akashi.hyogo.jp":true,"ako.hyogo.jp":true,"amagasaki.hyogo.jp":true,"aogaki.hyogo.jp":true,"asago.hyogo.jp":true,"ashiya.hyogo.jp":true,"awaji.hyogo.jp":true,"fukusaki.hyogo.jp":true,"goshiki.hyogo.jp":true,"harima.hyogo.jp":true,"himeji.hyogo.jp":true,"ichikawa.hyogo.jp":true,"inagawa.hyogo.jp":true,"itami.hyogo.jp":true,"kakogawa.hyogo.jp":true,"kamigori.hyogo.jp":true,"kamikawa.hyogo.jp":true,"kasai.hyogo.jp":true,"kasuga.hyogo.jp":true,"kawanishi.hyogo.jp":true,"miki.hyogo.jp":true,"minamiawaji.hyogo.jp":true,"nishinomiya.hyogo.jp":true,"nishiwaki.hyogo.jp":true,"ono.hyogo.jp":true,"sanda.hyogo.jp":true,"sannan.hyogo.jp":true,"sasayama.hyogo.jp":true,"sayo.hyogo.jp":true,"shingu.hyogo.jp":true,"shinonsen.hyogo.jp":true,"shiso.hyogo.jp":true,"sumoto.hyogo.jp":true,"taishi.hyogo.jp":true,"taka.hyogo.jp":true,"takarazuka.hyogo.jp":true,"takasago.hyogo.jp":true,"takino.hyogo.jp":true,"tamba.hyogo.jp":true,"tatsuno.hyogo.jp":true,"toyooka.hyogo.jp":true,"yabu.hyogo.jp":true,"yashiro.hyogo.jp":true,"yoka.hyogo.jp":true,"yokawa.hyogo.jp":true,"ami.ibaraki.jp":true,"asahi.ibaraki.jp":true,"bando.ibaraki.jp":true,"chikusei.ibaraki.jp":true,"daigo.ibaraki.jp":true,"fujishiro.ibaraki.jp":true,"hitachi.ibaraki.jp":true,"hitachinaka.ibaraki.jp":true,"hitachiomiya.ibaraki.jp":true,"hitachiota.ibaraki.jp":true,"ibaraki.ibaraki.jp":true,"ina.ibaraki.jp":true,"inashiki.ibaraki.jp":true,"itako.ibaraki.jp":true,"iwama.ibaraki.jp":true,"joso.ibaraki.jp":true,"kamisu.ibaraki.jp":true,"kasama.ibaraki.jp":true,"kashima.ibaraki.jp":true,"kasumigaura.ibaraki.jp":true,"koga.ibaraki.jp":true,"miho.ibaraki.jp":true,"mito.ibaraki.jp":true,"moriya.ibaraki.jp":true,"naka.ibaraki.jp":true,"namegata.ibaraki.jp":true,"oarai.ibaraki.jp":true,"ogawa.ibaraki.jp":true,"omitama.ibaraki.jp":true,"ryugasaki.ibaraki.jp":true,"sakai.ibaraki.jp":true,"sakuragawa.ibaraki.jp":true,"shimodate.ibaraki.jp":true,"shimotsuma.ibaraki.jp":true,"shirosato.ibaraki.jp":true,"sowa.ibaraki.jp":true,"suifu.ibaraki.jp":true,"takahagi.ibaraki.jp":true,"tamatsukuri.ibaraki.jp":true,"tokai.ibaraki.jp":true,"tomobe.ibaraki.jp":true,"tone.ibaraki.jp":true,"toride.ibaraki.jp":true,"tsuchiura.ibaraki.jp":true,"tsukuba.ibaraki.jp":true,"uchihara.ibaraki.jp":true,"ushiku.ibaraki.jp":true,"yachiyo.ibaraki.jp":true,"yamagata.ibaraki.jp":true,"yawara.ibaraki.jp":true,"yuki.ibaraki.jp":true,"anamizu.ishikawa.jp":true,"hakui.ishikawa.jp":true,"hakusan.ishikawa.jp":true,"kaga.ishikawa.jp":true,"kahoku.ishikawa.jp":true,"kanazawa.ishikawa.jp":true,"kawakita.ishikawa.jp":true,"komatsu.ishikawa.jp":true,"nakanoto.ishikawa.jp":true,"nanao.ishikawa.jp":true,"nomi.ishikawa.jp":true,"nonoichi.ishikawa.jp":true,"noto.ishikawa.jp":true,"shika.ishikawa.jp":true,"suzu.ishikawa.jp":true,"tsubata.ishikawa.jp":true,"tsurugi.ishikawa.jp":true,"uchinada.ishikawa.jp":true,"wajima.ishikawa.jp":true,"fudai.iwate.jp":true,"fujisawa.iwate.jp":true,"hanamaki.iwate.jp":true,"hiraizumi.iwate.jp":true,"hirono.iwate.jp":true,"ichinohe.iwate.jp":true,"ichinoseki.iwate.jp":true,"iwaizumi.iwate.jp":true,"iwate.iwate.jp":true,"joboji.iwate.jp":true,"kamaishi.iwate.jp":true,"kanegasaki.iwate.jp":true,"karumai.iwate.jp":true,"kawai.iwate.jp":true,"kitakami.iwate.jp":true,"kuji.iwate.jp":true,"kunohe.iwate.jp":true,"kuzumaki.iwate.jp":true,"miyako.iwate.jp":true,"mizusawa.iwate.jp":true,"morioka.iwate.jp":true,"ninohe.iwate.jp":true,"noda.iwate.jp":true,"ofunato.iwate.jp":true,"oshu.iwate.jp":true,"otsuchi.iwate.jp":true,"rikuzentakata.iwate.jp":true,"shiwa.iwate.jp":true,"shizukuishi.iwate.jp":true,"sumita.iwate.jp":true,"tanohata.iwate.jp":true,"tono.iwate.jp":true,"yahaba.iwate.jp":true,"yamada.iwate.jp":true,"ayagawa.kagawa.jp":true,"higashikagawa.kagawa.jp":true,"kanonji.kagawa.jp":true,"kotohira.kagawa.jp":true,"manno.kagawa.jp":true,"marugame.kagawa.jp":true,"mitoyo.kagawa.jp":true,"naoshima.kagawa.jp":true,"sanuki.kagawa.jp":true,"tadotsu.kagawa.jp":true,"takamatsu.kagawa.jp":true,"tonosho.kagawa.jp":true,"uchinomi.kagawa.jp":true,"utazu.kagawa.jp":true,"zentsuji.kagawa.jp":true,"akune.kagoshima.jp":true,"amami.kagoshima.jp":true,"hioki.kagoshima.jp":true,"isa.kagoshima.jp":true,"isen.kagoshima.jp":true,"izumi.kagoshima.jp":true,"kagoshima.kagoshima.jp":true,"kanoya.kagoshima.jp":true,"kawanabe.kagoshima.jp":true,"kinko.kagoshima.jp":true,"kouyama.kagoshima.jp":true,"makurazaki.kagoshima.jp":true,"matsumoto.kagoshima.jp":true,"minamitane.kagoshima.jp":true,"nakatane.kagoshima.jp":true,"nishinoomote.kagoshima.jp":true,"satsumasendai.kagoshima.jp":true,"soo.kagoshima.jp":true,"tarumizu.kagoshima.jp":true,"yusui.kagoshima.jp":true,"aikawa.kanagawa.jp":true,"atsugi.kanagawa.jp":true,"ayase.kanagawa.jp":true,"chigasaki.kanagawa.jp":true,"ebina.kanagawa.jp":true,"fujisawa.kanagawa.jp":true,"hadano.kanagawa.jp":true,"hakone.kanagawa.jp":true,"hiratsuka.kanagawa.jp":true,"isehara.kanagawa.jp":true,"kaisei.kanagawa.jp":true,"kamakura.kanagawa.jp":true,"kiyokawa.kanagawa.jp":true,"matsuda.kanagawa.jp":true,"minamiashigara.kanagawa.jp":true,"miura.kanagawa.jp":true,"nakai.kanagawa.jp":true,"ninomiya.kanagawa.jp":true,"odawara.kanagawa.jp":true,"oi.kanagawa.jp":true,"oiso.kanagawa.jp":true,"sagamihara.kanagawa.jp":true,"samukawa.kanagawa.jp":true,"tsukui.kanagawa.jp":true,"yamakita.kanagawa.jp":true,"yamato.kanagawa.jp":true,"yokosuka.kanagawa.jp":true,"yugawara.kanagawa.jp":true,"zama.kanagawa.jp":true,"zushi.kanagawa.jp":true,"aki.kochi.jp":true,"geisei.kochi.jp":true,"hidaka.kochi.jp":true,"higashitsuno.kochi.jp":true,"ino.kochi.jp":true,"kagami.kochi.jp":true,"kami.kochi.jp":true,"kitagawa.kochi.jp":true,"kochi.kochi.jp":true,"mihara.kochi.jp":true,"motoyama.kochi.jp":true,"muroto.kochi.jp":true,"nahari.kochi.jp":true,"nakamura.kochi.jp":true,"nankoku.kochi.jp":true,"nishitosa.kochi.jp":true,"niyodogawa.kochi.jp":true,"ochi.kochi.jp":true,"okawa.kochi.jp":true,"otoyo.kochi.jp":true,"otsuki.kochi.jp":true,"sakawa.kochi.jp":true,"sukumo.kochi.jp":true,"susaki.kochi.jp":true,"tosa.kochi.jp":true,"tosashimizu.kochi.jp":true,"toyo.kochi.jp":true,"tsuno.kochi.jp":true,"umaji.kochi.jp":true,"yasuda.kochi.jp":true,"yusuhara.kochi.jp":true,"amakusa.kumamoto.jp":true,"arao.kumamoto.jp":true,"aso.kumamoto.jp":true,"choyo.kumamoto.jp":true,"gyokuto.kumamoto.jp":true,"hitoyoshi.kumamoto.jp":true,"kamiamakusa.kumamoto.jp":true,"kashima.kumamoto.jp":true,"kikuchi.kumamoto.jp":true,"kosa.kumamoto.jp":true,"kumamoto.kumamoto.jp":true,"mashiki.kumamoto.jp":true,"mifune.kumamoto.jp":true,"minamata.kumamoto.jp":true,"minamioguni.kumamoto.jp":true,"nagasu.kumamoto.jp":true,"nishihara.kumamoto.jp":true,"oguni.kumamoto.jp":true,"ozu.kumamoto.jp":true,"sumoto.kumamoto.jp":true,"takamori.kumamoto.jp":true,"uki.kumamoto.jp":true,"uto.kumamoto.jp":true,"yamaga.kumamoto.jp":true,"yamato.kumamoto.jp":true,"yatsushiro.kumamoto.jp":true,"ayabe.kyoto.jp":true,"fukuchiyama.kyoto.jp":true,"higashiyama.kyoto.jp":true,"ide.kyoto.jp":true,"ine.kyoto.jp":true,"joyo.kyoto.jp":true,"kameoka.kyoto.jp":true,"kamo.kyoto.jp":true,"kita.kyoto.jp":true,"kizu.kyoto.jp":true,"kumiyama.kyoto.jp":true,"kyotamba.kyoto.jp":true,"kyotanabe.kyoto.jp":true,"kyotango.kyoto.jp":true,"maizuru.kyoto.jp":true,"minami.kyoto.jp":true,"minamiyamashiro.kyoto.jp":true,"miyazu.kyoto.jp":true,"muko.kyoto.jp":true,"nagaokakyo.kyoto.jp":true,"nakagyo.kyoto.jp":true,"nantan.kyoto.jp":true,"oyamazaki.kyoto.jp":true,"sakyo.kyoto.jp":true,"seika.kyoto.jp":true,"tanabe.kyoto.jp":true,"uji.kyoto.jp":true,"ujitawara.kyoto.jp":true,"wazuka.kyoto.jp":true,"yamashina.kyoto.jp":true,"yawata.kyoto.jp":true,"asahi.mie.jp":true,"inabe.mie.jp":true,"ise.mie.jp":true,"kameyama.mie.jp":true,"kawagoe.mie.jp":true,"kiho.mie.jp":true,"kisosaki.mie.jp":true,"kiwa.mie.jp":true,"komono.mie.jp":true,"kumano.mie.jp":true,"kuwana.mie.jp":true,"matsusaka.mie.jp":true,"meiwa.mie.jp":true,"mihama.mie.jp":true,"minamiise.mie.jp":true,"misugi.mie.jp":true,"miyama.mie.jp":true,"nabari.mie.jp":true,"shima.mie.jp":true,"suzuka.mie.jp":true,"tado.mie.jp":true,"taiki.mie.jp":true,"taki.mie.jp":true,"tamaki.mie.jp":true,"toba.mie.jp":true,"tsu.mie.jp":true,"udono.mie.jp":true,"ureshino.mie.jp":true,"watarai.mie.jp":true,"yokkaichi.mie.jp":true,"furukawa.miyagi.jp":true,"higashimatsushima.miyagi.jp":true,"ishinomaki.miyagi.jp":true,"iwanuma.miyagi.jp":true,"kakuda.miyagi.jp":true,"kami.miyagi.jp":true,"kawasaki.miyagi.jp":true,"kesennuma.miyagi.jp":true,"marumori.miyagi.jp":true,"matsushima.miyagi.jp":true,"minamisanriku.miyagi.jp":true,"misato.miyagi.jp":true,"murata.miyagi.jp":true,"natori.miyagi.jp":true,"ogawara.miyagi.jp":true,"ohira.miyagi.jp":true,"onagawa.miyagi.jp":true,"osaki.miyagi.jp":true,"rifu.miyagi.jp":true,"semine.miyagi.jp":true,"shibata.miyagi.jp":true,"shichikashuku.miyagi.jp":true,"shikama.miyagi.jp":true,"shiogama.miyagi.jp":true,"shiroishi.miyagi.jp":true,"tagajo.miyagi.jp":true,"taiwa.miyagi.jp":true,"tome.miyagi.jp":true,"tomiya.miyagi.jp":true,"wakuya.miyagi.jp":true,"watari.miyagi.jp":true,"yamamoto.miyagi.jp":true,"zao.miyagi.jp":true,"aya.miyazaki.jp":true,"ebino.miyazaki.jp":true,"gokase.miyazaki.jp":true,"hyuga.miyazaki.jp":true,"kadogawa.miyazaki.jp":true,"kawaminami.miyazaki.jp":true,"kijo.miyazaki.jp":true,"kitagawa.miyazaki.jp":true,"kitakata.miyazaki.jp":true,"kitaura.miyazaki.jp":true,"kobayashi.miyazaki.jp":true,"kunitomi.miyazaki.jp":true,"kushima.miyazaki.jp":true,"mimata.miyazaki.jp":true,"miyakonojo.miyazaki.jp":true,"miyazaki.miyazaki.jp":true,"morotsuka.miyazaki.jp":true,"nichinan.miyazaki.jp":true,"nishimera.miyazaki.jp":true,"nobeoka.miyazaki.jp":true,"saito.miyazaki.jp":true,"shiiba.miyazaki.jp":true,"shintomi.miyazaki.jp":true,"takaharu.miyazaki.jp":true,"takanabe.miyazaki.jp":true,"takazaki.miyazaki.jp":true,"tsuno.miyazaki.jp":true,"achi.nagano.jp":true,"agematsu.nagano.jp":true,"anan.nagano.jp":true,"aoki.nagano.jp":true,"asahi.nagano.jp":true,"azumino.nagano.jp":true,"chikuhoku.nagano.jp":true,"chikuma.nagano.jp":true,"chino.nagano.jp":true,"fujimi.nagano.jp":true,"hakuba.nagano.jp":true,"hara.nagano.jp":true,"hiraya.nagano.jp":true,"iida.nagano.jp":true,"iijima.nagano.jp":true,"iiyama.nagano.jp":true,"iizuna.nagano.jp":true,"ikeda.nagano.jp":true,"ikusaka.nagano.jp":true,"ina.nagano.jp":true,"karuizawa.nagano.jp":true,"kawakami.nagano.jp":true,"kiso.nagano.jp":true,"kisofukushima.nagano.jp":true,"kitaaiki.nagano.jp":true,"komagane.nagano.jp":true,"komoro.nagano.jp":true,"matsukawa.nagano.jp":true,"matsumoto.nagano.jp":true,"miasa.nagano.jp":true,"minamiaiki.nagano.jp":true,"minamimaki.nagano.jp":true,"minamiminowa.nagano.jp":true,"minowa.nagano.jp":true,"miyada.nagano.jp":true,"miyota.nagano.jp":true,"mochizuki.nagano.jp":true,"nagano.nagano.jp":true,"nagawa.nagano.jp":true,"nagiso.nagano.jp":true,"nakagawa.nagano.jp":true,"nakano.nagano.jp":true,"nozawaonsen.nagano.jp":true,"obuse.nagano.jp":true,"ogawa.nagano.jp":true,"okaya.nagano.jp":true,"omachi.nagano.jp":true,"omi.nagano.jp":true,"ookuwa.nagano.jp":true,"ooshika.nagano.jp":true,"otaki.nagano.jp":true,"otari.nagano.jp":true,"sakae.nagano.jp":true,"sakaki.nagano.jp":true,"saku.nagano.jp":true,"sakuho.nagano.jp":true,"shimosuwa.nagano.jp":true,"shinanomachi.nagano.jp":true,"shiojiri.nagano.jp":true,"suwa.nagano.jp":true,"suzaka.nagano.jp":true,"takagi.nagano.jp":true,"takamori.nagano.jp":true,"takayama.nagano.jp":true,"tateshina.nagano.jp":true,"tatsuno.nagano.jp":true,"togakushi.nagano.jp":true,"togura.nagano.jp":true,"tomi.nagano.jp":true,"ueda.nagano.jp":true,"wada.nagano.jp":true,"yamagata.nagano.jp":true,"yamanouchi.nagano.jp":true,"yasaka.nagano.jp":true,"yasuoka.nagano.jp":true,"chijiwa.nagasaki.jp":true,"futsu.nagasaki.jp":true,"goto.nagasaki.jp":true,"hasami.nagasaki.jp":true,"hirado.nagasaki.jp":true,"iki.nagasaki.jp":true,"isahaya.nagasaki.jp":true,"kawatana.nagasaki.jp":true,"kuchinotsu.nagasaki.jp":true,"matsuura.nagasaki.jp":true,"nagasaki.nagasaki.jp":true,"obama.nagasaki.jp":true,"omura.nagasaki.jp":true,"oseto.nagasaki.jp":true,"saikai.nagasaki.jp":true,"sasebo.nagasaki.jp":true,"seihi.nagasaki.jp":true,"shimabara.nagasaki.jp":true,"shinkamigoto.nagasaki.jp":true,"togitsu.nagasaki.jp":true,"tsushima.nagasaki.jp":true,"unzen.nagasaki.jp":true,"ando.nara.jp":true,"gose.nara.jp":true,"heguri.nara.jp":true,"higashiyoshino.nara.jp":true,"ikaruga.nara.jp":true,"ikoma.nara.jp":true,"kamikitayama.nara.jp":true,"kanmaki.nara.jp":true,"kashiba.nara.jp":true,"kashihara.nara.jp":true,"katsuragi.nara.jp":true,"kawai.nara.jp":true,"kawakami.nara.jp":true,"kawanishi.nara.jp":true,"koryo.nara.jp":true,"kurotaki.nara.jp":true,"mitsue.nara.jp":true,"miyake.nara.jp":true,"nara.nara.jp":true,"nosegawa.nara.jp":true,"oji.nara.jp":true,"ouda.nara.jp":true,"oyodo.nara.jp":true,"sakurai.nara.jp":true,"sango.nara.jp":true,"shimoichi.nara.jp":true,"shimokitayama.nara.jp":true,"shinjo.nara.jp":true,"soni.nara.jp":true,"takatori.nara.jp":true,"tawaramoto.nara.jp":true,"tenkawa.nara.jp":true,"tenri.nara.jp":true,"uda.nara.jp":true,"yamatokoriyama.nara.jp":true,"yamatotakada.nara.jp":true,"yamazoe.nara.jp":true,"yoshino.nara.jp":true,"aga.niigata.jp":true,"agano.niigata.jp":true,"gosen.niigata.jp":true,"itoigawa.niigata.jp":true,"izumozaki.niigata.jp":true,"joetsu.niigata.jp":true,"kamo.niigata.jp":true,"kariwa.niigata.jp":true,"kashiwazaki.niigata.jp":true,"minamiuonuma.niigata.jp":true,"mitsuke.niigata.jp":true,"muika.niigata.jp":true,"murakami.niigata.jp":true,"myoko.niigata.jp":true,"nagaoka.niigata.jp":true,"niigata.niigata.jp":true,"ojiya.niigata.jp":true,"omi.niigata.jp":true,"sado.niigata.jp":true,"sanjo.niigata.jp":true,"seiro.niigata.jp":true,"seirou.niigata.jp":true,"sekikawa.niigata.jp":true,"shibata.niigata.jp":true,"tagami.niigata.jp":true,"tainai.niigata.jp":true,"tochio.niigata.jp":true,"tokamachi.niigata.jp":true,"tsubame.niigata.jp":true,"tsunan.niigata.jp":true,"uonuma.niigata.jp":true,"yahiko.niigata.jp":true,"yoita.niigata.jp":true,"yuzawa.niigata.jp":true,"beppu.oita.jp":true,"bungoono.oita.jp":true,"bungotakada.oita.jp":true,"hasama.oita.jp":true,"hiji.oita.jp":true,"himeshima.oita.jp":true,"hita.oita.jp":true,"kamitsue.oita.jp":true,"kokonoe.oita.jp":true,"kuju.oita.jp":true,"kunisaki.oita.jp":true,"kusu.oita.jp":true,"oita.oita.jp":true,"saiki.oita.jp":true,"taketa.oita.jp":true,"tsukumi.oita.jp":true,"usa.oita.jp":true,"usuki.oita.jp":true,"yufu.oita.jp":true,"akaiwa.okayama.jp":true,"asakuchi.okayama.jp":true,"bizen.okayama.jp":true,"hayashima.okayama.jp":true,"ibara.okayama.jp":true,"kagamino.okayama.jp":true,"kasaoka.okayama.jp":true,"kibichuo.okayama.jp":true,"kumenan.okayama.jp":true,"kurashiki.okayama.jp":true,"maniwa.okayama.jp":true,"misaki.okayama.jp":true,"nagi.okayama.jp":true,"niimi.okayama.jp":true,"nishiawakura.okayama.jp":true,"okayama.okayama.jp":true,"satosho.okayama.jp":true,"setouchi.okayama.jp":true,"shinjo.okayama.jp":true,"shoo.okayama.jp":true,"soja.okayama.jp":true,"takahashi.okayama.jp":true,"tamano.okayama.jp":true,"tsuyama.okayama.jp":true,"wake.okayama.jp":true,"yakage.okayama.jp":true,"aguni.okinawa.jp":true,"ginowan.okinawa.jp":true,"ginoza.okinawa.jp":true,"gushikami.okinawa.jp":true,"haebaru.okinawa.jp":true,"higashi.okinawa.jp":true,"hirara.okinawa.jp":true,"iheya.okinawa.jp":true,"ishigaki.okinawa.jp":true,"ishikawa.okinawa.jp":true,"itoman.okinawa.jp":true,"izena.okinawa.jp":true,"kadena.okinawa.jp":true,"kin.okinawa.jp":true,"kitadaito.okinawa.jp":true,"kitanakagusuku.okinawa.jp":true,"kumejima.okinawa.jp":true,"kunigami.okinawa.jp":true,"minamidaito.okinawa.jp":true,"motobu.okinawa.jp":true,"nago.okinawa.jp":true,"naha.okinawa.jp":true,"nakagusuku.okinawa.jp":true,"nakijin.okinawa.jp":true,"nanjo.okinawa.jp":true,"nishihara.okinawa.jp":true,"ogimi.okinawa.jp":true,"okinawa.okinawa.jp":true,"onna.okinawa.jp":true,"shimoji.okinawa.jp":true,"taketomi.okinawa.jp":true,"tarama.okinawa.jp":true,"tokashiki.okinawa.jp":true,"tomigusuku.okinawa.jp":true,"tonaki.okinawa.jp":true,"urasoe.okinawa.jp":true,"uruma.okinawa.jp":true,"yaese.okinawa.jp":true,"yomitan.okinawa.jp":true,"yonabaru.okinawa.jp":true,"yonaguni.okinawa.jp":true,"zamami.okinawa.jp":true,"abeno.osaka.jp":true,"chihayaakasaka.osaka.jp":true,"chuo.osaka.jp":true,"daito.osaka.jp":true,"fujiidera.osaka.jp":true,"habikino.osaka.jp":true,"hannan.osaka.jp":true,"higashiosaka.osaka.jp":true,"higashisumiyoshi.osaka.jp":true,"higashiyodogawa.osaka.jp":true,"hirakata.osaka.jp":true,"ibaraki.osaka.jp":true,"ikeda.osaka.jp":true,"izumi.osaka.jp":true,"izumiotsu.osaka.jp":true,"izumisano.osaka.jp":true,"kadoma.osaka.jp":true,"kaizuka.osaka.jp":true,"kanan.osaka.jp":true,"kashiwara.osaka.jp":true,"katano.osaka.jp":true,"kawachinagano.osaka.jp":true,"kishiwada.osaka.jp":true,"kita.osaka.jp":true,"kumatori.osaka.jp":true,"matsubara.osaka.jp":true,"minato.osaka.jp":true,"minoh.osaka.jp":true,"misaki.osaka.jp":true,"moriguchi.osaka.jp":true,"neyagawa.osaka.jp":true,"nishi.osaka.jp":true,"nose.osaka.jp":true,"osakasayama.osaka.jp":true,"sakai.osaka.jp":true,"sayama.osaka.jp":true,"sennan.osaka.jp":true,"settsu.osaka.jp":true,"shijonawate.osaka.jp":true,"shimamoto.osaka.jp":true,"suita.osaka.jp":true,"tadaoka.osaka.jp":true,"taishi.osaka.jp":true,"tajiri.osaka.jp":true,"takaishi.osaka.jp":true,"takatsuki.osaka.jp":true,"tondabayashi.osaka.jp":true,"toyonaka.osaka.jp":true,"toyono.osaka.jp":true,"yao.osaka.jp":true,"ariake.saga.jp":true,"arita.saga.jp":true,"fukudomi.saga.jp":true,"genkai.saga.jp":true,"hamatama.saga.jp":true,"hizen.saga.jp":true,"imari.saga.jp":true,"kamimine.saga.jp":true,"kanzaki.saga.jp":true,"karatsu.saga.jp":true,"kashima.saga.jp":true,"kitagata.saga.jp":true,"kitahata.saga.jp":true,"kiyama.saga.jp":true,"kouhoku.saga.jp":true,"kyuragi.saga.jp":true,"nishiarita.saga.jp":true,"ogi.saga.jp":true,"omachi.saga.jp":true,"ouchi.saga.jp":true,"saga.saga.jp":true,"shiroishi.saga.jp":true,"taku.saga.jp":true,"tara.saga.jp":true,"tosu.saga.jp":true,"yoshinogari.saga.jp":true,"arakawa.saitama.jp":true,"asaka.saitama.jp":true,"chichibu.saitama.jp":true,"fujimi.saitama.jp":true,"fujimino.saitama.jp":true,"fukaya.saitama.jp":true,"hanno.saitama.jp":true,"hanyu.saitama.jp":true,"hasuda.saitama.jp":true,"hatogaya.saitama.jp":true,"hatoyama.saitama.jp":true,"hidaka.saitama.jp":true,"higashichichibu.saitama.jp":true,"higashimatsuyama.saitama.jp":true,"honjo.saitama.jp":true,"ina.saitama.jp":true,"iruma.saitama.jp":true,"iwatsuki.saitama.jp":true,"kamiizumi.saitama.jp":true,"kamikawa.saitama.jp":true,"kamisato.saitama.jp":true,"kasukabe.saitama.jp":true,"kawagoe.saitama.jp":true,"kawaguchi.saitama.jp":true,"kawajima.saitama.jp":true,"kazo.saitama.jp":true,"kitamoto.saitama.jp":true,"koshigaya.saitama.jp":true,"kounosu.saitama.jp":true,"kuki.saitama.jp":true,"kumagaya.saitama.jp":true,"matsubushi.saitama.jp":true,"minano.saitama.jp":true,"misato.saitama.jp":true,"miyashiro.saitama.jp":true,"miyoshi.saitama.jp":true,"moroyama.saitama.jp":true,"nagatoro.saitama.jp":true,"namegawa.saitama.jp":true,"niiza.saitama.jp":true,"ogano.saitama.jp":true,"ogawa.saitama.jp":true,"ogose.saitama.jp":true,"okegawa.saitama.jp":true,"omiya.saitama.jp":true,"otaki.saitama.jp":true,"ranzan.saitama.jp":true,"ryokami.saitama.jp":true,"saitama.saitama.jp":true,"sakado.saitama.jp":true,"satte.saitama.jp":true,"sayama.saitama.jp":true,"shiki.saitama.jp":true,"shiraoka.saitama.jp":true,"soka.saitama.jp":true,"sugito.saitama.jp":true,"toda.saitama.jp":true,"tokigawa.saitama.jp":true,"tokorozawa.saitama.jp":true,"tsurugashima.saitama.jp":true,"urawa.saitama.jp":true,"warabi.saitama.jp":true,"yashio.saitama.jp":true,"yokoze.saitama.jp":true,"yono.saitama.jp":true,"yorii.saitama.jp":true,"yoshida.saitama.jp":true,"yoshikawa.saitama.jp":true,"yoshimi.saitama.jp":true,"aisho.shiga.jp":true,"gamo.shiga.jp":true,"higashiomi.shiga.jp":true,"hikone.shiga.jp":true,"koka.shiga.jp":true,"konan.shiga.jp":true,"kosei.shiga.jp":true,"koto.shiga.jp":true,"kusatsu.shiga.jp":true,"maibara.shiga.jp":true,"moriyama.shiga.jp":true,"nagahama.shiga.jp":true,"nishiazai.shiga.jp":true,"notogawa.shiga.jp":true,"omihachiman.shiga.jp":true,"otsu.shiga.jp":true,"ritto.shiga.jp":true,"ryuoh.shiga.jp":true,"takashima.shiga.jp":true,"takatsuki.shiga.jp":true,"torahime.shiga.jp":true,"toyosato.shiga.jp":true,"yasu.shiga.jp":true,"akagi.shimane.jp":true,"ama.shimane.jp":true,"gotsu.shimane.jp":true,"hamada.shimane.jp":true,"higashiizumo.shimane.jp":true,"hikawa.shimane.jp":true,"hikimi.shimane.jp":true,"izumo.shimane.jp":true,"kakinoki.shimane.jp":true,"masuda.shimane.jp":true,"matsue.shimane.jp":true,"misato.shimane.jp":true,"nishinoshima.shimane.jp":true,"ohda.shimane.jp":true,"okinoshima.shimane.jp":true,"okuizumo.shimane.jp":true,"shimane.shimane.jp":true,"tamayu.shimane.jp":true,"tsuwano.shimane.jp":true,"unnan.shimane.jp":true,"yakumo.shimane.jp":true,"yasugi.shimane.jp":true,"yatsuka.shimane.jp":true,"arai.shizuoka.jp":true,"atami.shizuoka.jp":true,"fuji.shizuoka.jp":true,"fujieda.shizuoka.jp":true,"fujikawa.shizuoka.jp":true,"fujinomiya.shizuoka.jp":true,"fukuroi.shizuoka.jp":true,"gotemba.shizuoka.jp":true,"haibara.shizuoka.jp":true,"hamamatsu.shizuoka.jp":true,"higashiizu.shizuoka.jp":true,"ito.shizuoka.jp":true,"iwata.shizuoka.jp":true,"izu.shizuoka.jp":true,"izunokuni.shizuoka.jp":true,"kakegawa.shizuoka.jp":true,"kannami.shizuoka.jp":true,"kawanehon.shizuoka.jp":true,"kawazu.shizuoka.jp":true,"kikugawa.shizuoka.jp":true,"kosai.shizuoka.jp":true,"makinohara.shizuoka.jp":true,"matsuzaki.shizuoka.jp":true,"minamiizu.shizuoka.jp":true,"mishima.shizuoka.jp":true,"morimachi.shizuoka.jp":true,"nishiizu.shizuoka.jp":true,"numazu.shizuoka.jp":true,"omaezaki.shizuoka.jp":true,"shimada.shizuoka.jp":true,"shimizu.shizuoka.jp":true,"shimoda.shizuoka.jp":true,"shizuoka.shizuoka.jp":true,"susono.shizuoka.jp":true,"yaizu.shizuoka.jp":true,"yoshida.shizuoka.jp":true,"ashikaga.tochigi.jp":true,"bato.tochigi.jp":true,"haga.tochigi.jp":true,"ichikai.tochigi.jp":true,"iwafune.tochigi.jp":true,"kaminokawa.tochigi.jp":true,"kanuma.tochigi.jp":true,"karasuyama.tochigi.jp":true,"kuroiso.tochigi.jp":true,"mashiko.tochigi.jp":true,"mibu.tochigi.jp":true,"moka.tochigi.jp":true,"motegi.tochigi.jp":true,"nasu.tochigi.jp":true,"nasushiobara.tochigi.jp":true,"nikko.tochigi.jp":true,"nishikata.tochigi.jp":true,"nogi.tochigi.jp":true,"ohira.tochigi.jp":true,"ohtawara.tochigi.jp":true,"oyama.tochigi.jp":true,"sakura.tochigi.jp":true,"sano.tochigi.jp":true,"shimotsuke.tochigi.jp":true,"shioya.tochigi.jp":true,"takanezawa.tochigi.jp":true,"tochigi.tochigi.jp":true,"tsuga.tochigi.jp":true,"ujiie.tochigi.jp":true,"utsunomiya.tochigi.jp":true,"yaita.tochigi.jp":true,"aizumi.tokushima.jp":true,"anan.tokushima.jp":true,"ichiba.tokushima.jp":true,"itano.tokushima.jp":true,"kainan.tokushima.jp":true,"komatsushima.tokushima.jp":true,"matsushige.tokushima.jp":true,"mima.tokushima.jp":true,"minami.tokushima.jp":true,"miyoshi.tokushima.jp":true,"mugi.tokushima.jp":true,"nakagawa.tokushima.jp":true,"naruto.tokushima.jp":true,"sanagochi.tokushima.jp":true,"shishikui.tokushima.jp":true,"tokushima.tokushima.jp":true,"wajiki.tokushima.jp":true,"adachi.tokyo.jp":true,"akiruno.tokyo.jp":true,"akishima.tokyo.jp":true,"aogashima.tokyo.jp":true,"arakawa.tokyo.jp":true,"bunkyo.tokyo.jp":true,"chiyoda.tokyo.jp":true,"chofu.tokyo.jp":true,"chuo.tokyo.jp":true,"edogawa.tokyo.jp":true,"fuchu.tokyo.jp":true,"fussa.tokyo.jp":true,"hachijo.tokyo.jp":true,"hachioji.tokyo.jp":true,"hamura.tokyo.jp":true,"higashikurume.tokyo.jp":true,"higashimurayama.tokyo.jp":true,"higashiyamato.tokyo.jp":true,"hino.tokyo.jp":true,"hinode.tokyo.jp":true,"hinohara.tokyo.jp":true,"inagi.tokyo.jp":true,"itabashi.tokyo.jp":true,"katsushika.tokyo.jp":true,"kita.tokyo.jp":true,"kiyose.tokyo.jp":true,"kodaira.tokyo.jp":true,"koganei.tokyo.jp":true,"kokubunji.tokyo.jp":true,"komae.tokyo.jp":true,"koto.tokyo.jp":true,"kouzushima.tokyo.jp":true,"kunitachi.tokyo.jp":true,"machida.tokyo.jp":true,"meguro.tokyo.jp":true,"minato.tokyo.jp":true,"mitaka.tokyo.jp":true,"mizuho.tokyo.jp":true,"musashimurayama.tokyo.jp":true,"musashino.tokyo.jp":true,"nakano.tokyo.jp":true,"nerima.tokyo.jp":true,"ogasawara.tokyo.jp":true,"okutama.tokyo.jp":true,"ome.tokyo.jp":true,"oshima.tokyo.jp":true,"ota.tokyo.jp":true,"setagaya.tokyo.jp":true,"shibuya.tokyo.jp":true,"shinagawa.tokyo.jp":true,"shinjuku.tokyo.jp":true,"suginami.tokyo.jp":true,"sumida.tokyo.jp":true,"tachikawa.tokyo.jp":true,"taito.tokyo.jp":true,"tama.tokyo.jp":true,"toshima.tokyo.jp":true,"chizu.tottori.jp":true,"hino.tottori.jp":true,"kawahara.tottori.jp":true,"koge.tottori.jp":true,"kotoura.tottori.jp":true,"misasa.tottori.jp":true,"nanbu.tottori.jp":true,"nichinan.tottori.jp":true,"sakaiminato.tottori.jp":true,"tottori.tottori.jp":true,"wakasa.tottori.jp":true,"yazu.tottori.jp":true,"yonago.tottori.jp":true,"asahi.toyama.jp":true,"fuchu.toyama.jp":true,"fukumitsu.toyama.jp":true,"funahashi.toyama.jp":true,"himi.toyama.jp":true,"imizu.toyama.jp":true,"inami.toyama.jp":true,"johana.toyama.jp":true,"kamiichi.toyama.jp":true,"kurobe.toyama.jp":true,"nakaniikawa.toyama.jp":true,"namerikawa.toyama.jp":true,"nanto.toyama.jp":true,"nyuzen.toyama.jp":true,"oyabe.toyama.jp":true,"taira.toyama.jp":true,"takaoka.toyama.jp":true,"tateyama.toyama.jp":true,"toga.toyama.jp":true,"tonami.toyama.jp":true,"toyama.toyama.jp":true,"unazuki.toyama.jp":true,"uozu.toyama.jp":true,"yamada.toyama.jp":true,"arida.wakayama.jp":true,"aridagawa.wakayama.jp":true,"gobo.wakayama.jp":true,"hashimoto.wakayama.jp":true,"hidaka.wakayama.jp":true,"hirogawa.wakayama.jp":true,"inami.wakayama.jp":true,"iwade.wakayama.jp":true,"kainan.wakayama.jp":true,"kamitonda.wakayama.jp":true,"katsuragi.wakayama.jp":true,"kimino.wakayama.jp":true,"kinokawa.wakayama.jp":true,"kitayama.wakayama.jp":true,"koya.wakayama.jp":true,"koza.wakayama.jp":true,"kozagawa.wakayama.jp":true,"kudoyama.wakayama.jp":true,"kushimoto.wakayama.jp":true,"mihama.wakayama.jp":true,"misato.wakayama.jp":true,"nachikatsuura.wakayama.jp":true,"shingu.wakayama.jp":true,"shirahama.wakayama.jp":true,"taiji.wakayama.jp":true,"tanabe.wakayama.jp":true,"wakayama.wakayama.jp":true,"yuasa.wakayama.jp":true,"yura.wakayama.jp":true,"asahi.yamagata.jp":true,"funagata.yamagata.jp":true,"higashine.yamagata.jp":true,"iide.yamagata.jp":true,"kahoku.yamagata.jp":true,"kaminoyama.yamagata.jp":true,"kaneyama.yamagata.jp":true,"kawanishi.yamagata.jp":true,"mamurogawa.yamagata.jp":true,"mikawa.yamagata.jp":true,"murayama.yamagata.jp":true,"nagai.yamagata.jp":true,"nakayama.yamagata.jp":true,"nanyo.yamagata.jp":true,"nishikawa.yamagata.jp":true,"obanazawa.yamagata.jp":true,"oe.yamagata.jp":true,"oguni.yamagata.jp":true,"ohkura.yamagata.jp":true,"oishida.yamagata.jp":true,"sagae.yamagata.jp":true,"sakata.yamagata.jp":true,"sakegawa.yamagata.jp":true,"shinjo.yamagata.jp":true,"shirataka.yamagata.jp":true,"shonai.yamagata.jp":true,"takahata.yamagata.jp":true,"tendo.yamagata.jp":true,"tozawa.yamagata.jp":true,"tsuruoka.yamagata.jp":true,"yamagata.yamagata.jp":true,"yamanobe.yamagata.jp":true,"yonezawa.yamagata.jp":true,"yuza.yamagata.jp":true,"abu.yamaguchi.jp":true,"hagi.yamaguchi.jp":true,"hikari.yamaguchi.jp":true,"hofu.yamaguchi.jp":true,"iwakuni.yamaguchi.jp":true,"kudamatsu.yamaguchi.jp":true,"mitou.yamaguchi.jp":true,"nagato.yamaguchi.jp":true,"oshima.yamaguchi.jp":true,"shimonoseki.yamaguchi.jp":true,"shunan.yamaguchi.jp":true,"tabuse.yamaguchi.jp":true,"tokuyama.yamaguchi.jp":true,"toyota.yamaguchi.jp":true,"ube.yamaguchi.jp":true,"yuu.yamaguchi.jp":true,"chuo.yamanashi.jp":true,"doshi.yamanashi.jp":true,"fuefuki.yamanashi.jp":true,"fujikawa.yamanashi.jp":true,"fujikawaguchiko.yamanashi.jp":true,"fujiyoshida.yamanashi.jp":true,"hayakawa.yamanashi.jp":true,"hokuto.yamanashi.jp":true,"ichikawamisato.yamanashi.jp":true,"kai.yamanashi.jp":true,"kofu.yamanashi.jp":true,"koshu.yamanashi.jp":true,"kosuge.yamanashi.jp":true,"minami-alps.yamanashi.jp":true,"minobu.yamanashi.jp":true,"nakamichi.yamanashi.jp":true,"nanbu.yamanashi.jp":true,"narusawa.yamanashi.jp":true,"nirasaki.yamanashi.jp":true,"nishikatsura.yamanashi.jp":true,"oshino.yamanashi.jp":true,"otsuki.yamanashi.jp":true,"showa.yamanashi.jp":true,"tabayama.yamanashi.jp":true,"tsuru.yamanashi.jp":true,"uenohara.yamanashi.jp":true,"yamanakako.yamanashi.jp":true,"yamanashi.yamanashi.jp":true,"*.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"kp":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"lb":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"lr":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"com.ms":true,"edu.ms":true,"gov.ms":true,"net.ms":true,"org.ms":true,"mt":true,"com.mt":true,"edu.mt":true,"net.mt":true,"org.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"*.mz":true,"teledata.mz":false,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ng":true,"com.ng":true,"edu.ng":true,"name.ng":true,"net.ng":true,"org.ng":true,"sch.ng":true,"gov.ng":true,"mil.ng":true,"mobi.ng":true,"*.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"nz":true,"ac.nz":true,"co.nz":true,"cri.nz":true,"geek.nz":true,"gen.nz":true,"govt.nz":true,"health.nz":true,"iwi.nz":true,"kiwi.nz":true,"maori.nz":true,"mil.nz":true,"xn--mori-qsa.nz":true,"net.nz":true,"org.nz":true,"parliament.nz":true,"school.nz":true,"om":true,"co.om":true,"com.om":true,"edu.om":true,"gov.om":true,"med.om":true,"museum.om":true,"net.om":true,"org.om":true,"pro.om":true,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"com.pl":true,"net.pl":true,"org.pl":true,"info.pl":true,"waw.pl":true,"gov.pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"uw.gov.pl":true,"um.gov.pl":true,"ug.gov.pl":true,"upow.gov.pl":true,"starostwo.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"po.gov.pl":true,"pa.gov.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"post":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aca.pro":true,"bar.pro":true,"cpa.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"eng.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"py":true,"com.py":true,"coop.py":true,"edu.py":true,"gov.py":true,"mil.py":true,"net.py":true,"org.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"com.re":true,"asso.re":true,"nom.re":true,"ro":true,"com.ro":true,"org.ro":true,"tm.ro":true,"nt.ro":true,"nom.ro":true,"info.ro":true,"rec.ro":true,"arts.ro":true,"firm.ro":true,"store.ro":true,"www.ro":true,"rs":true,"co.rs":true,"org.rs":true,"edu.rs":true,"ac.rs":true,"gov.rs":true,"in.rs":true,"ru":true,"ac.ru":true,"com.ru":true,"edu.ru":true,"int.ru":true,"net.ru":true,"org.ru":true,"pp.ru":true,"adygeya.ru":true,"altai.ru":true,"amur.ru":true,"arkhangelsk.ru":true,"astrakhan.ru":true,"bashkiria.ru":true,"belgorod.ru":true,"bir.ru":true,"bryansk.ru":true,"buryatia.ru":true,"cbg.ru":true,"chel.ru":true,"chelyabinsk.ru":true,"chita.ru":true,"chukotka.ru":true,"chuvashia.ru":true,"dagestan.ru":true,"dudinka.ru":true,"e-burg.ru":true,"grozny.ru":true,"irkutsk.ru":true,"ivanovo.ru":true,"izhevsk.ru":true,"jar.ru":true,"joshkar-ola.ru":true,"kalmykia.ru":true,"kaluga.ru":true,"kamchatka.ru":true,"karelia.ru":true,"kazan.ru":true,"kchr.ru":true,"kemerovo.ru":true,"khabarovsk.ru":true,"khakassia.ru":true,"khv.ru":true,"kirov.ru":true,"koenig.ru":true,"komi.ru":true,"kostroma.ru":true,"krasnoyarsk.ru":true,"kuban.ru":true,"kurgan.ru":true,"kursk.ru":true,"lipetsk.ru":true,"magadan.ru":true,"mari.ru":true,"mari-el.ru":true,"marine.ru":true,"mordovia.ru":true,"msk.ru":true,"murmansk.ru":true,"nalchik.ru":true,"nnov.ru":true,"nov.ru":true,"novosibirsk.ru":true,"nsk.ru":true,"omsk.ru":true,"orenburg.ru":true,"oryol.ru":true,"palana.ru":true,"penza.ru":true,"perm.ru":true,"ptz.ru":true,"rnd.ru":true,"ryazan.ru":true,"sakhalin.ru":true,"samara.ru":true,"saratov.ru":true,"simbirsk.ru":true,"smolensk.ru":true,"spb.ru":true,"stavropol.ru":true,"stv.ru":true,"surgut.ru":true,"tambov.ru":true,"tatarstan.ru":true,"tom.ru":true,"tomsk.ru":true,"tsaritsyn.ru":true,"tsk.ru":true,"tula.ru":true,"tuva.ru":true,"tver.ru":true,"tyumen.ru":true,"udm.ru":true,"udmurtia.ru":true,"ulan-ude.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"vladivostok.ru":true,"volgograd.ru":true,"vologda.ru":true,"voronezh.ru":true,"vrn.ru":true,"vyatka.ru":true,"yakutia.ru":true,"yamal.ru":true,"yaroslavl.ru":true,"yekaterinburg.ru":true,"yuzhno-sakhalinsk.ru":true,"amursk.ru":true,"baikal.ru":true,"cmw.ru":true,"fareast.ru":true,"jamal.ru":true,"kms.ru":true,"k-uralsk.ru":true,"kustanai.ru":true,"kuzbass.ru":true,"magnitka.ru":true,"mytis.ru":true,"nakhodka.ru":true,"nkz.ru":true,"norilsk.ru":true,"oskol.ru":true,"pyatigorsk.ru":true,"rubtsovsk.ru":true,"snz.ru":true,"syzran.ru":true,"vdonsk.ru":true,"zgrad.ru":true,"gov.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"tv.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"com.sh":true,"net.sh":true,"gov.sh":true,"org.sh":true,"mil.sh":true,"si":true,"sj":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"adygeya.su":true,"arkhangelsk.su":true,"balashov.su":true,"bashkiria.su":true,"bryansk.su":true,"dagestan.su":true,"grozny.su":true,"ivanovo.su":true,"kalmykia.su":true,"kaluga.su":true,"karelia.su":true,"khakassia.su":true,"krasnodar.su":true,"kurgan.su":true,"lenug.su":true,"mordovia.su":true,"msk.su":true,"murmansk.su":true,"nalchik.su":true,"nov.su":true,"obninsk.su":true,"penza.su":true,"pokrovsk.su":true,"sochi.su":true,"spb.su":true,"togliatti.su":true,"troitsk.su":true,"tula.su":true,"tuva.su":true,"vladikavkaz.su":true,"vladimir.su":true,"vologda.su":true,"sv":true,"com.sv":true,"edu.sv":true,"gob.sv":true,"org.sv":true,"red.sv":true,"sx":true,"gov.sx":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"com.tm":true,"co.tm":true,"org.tm":true,"net.tm":true,"nom.tm":true,"gov.tm":true,"mil.tm":true,"edu.tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"tp":true,"tr":true,"com.tr":true,"info.tr":true,"biz.tr":true,"net.tr":true,"org.tr":true,"web.tr":true,"gen.tr":true,"tv.tr":true,"av.tr":true,"dr.tr":true,"bbs.tr":true,"name.tr":true,"tel.tr":true,"gov.tr":true,"bel.tr":true,"pol.tr":true,"mil.tr":true,"k12.tr":true,"edu.tr":true,"kep.tr":true,"nc.tr":true,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"tz":true,"ac.tz":true,"co.tz":true,"go.tz":true,"hotel.tz":true,"info.tz":true,"me.tz":true,"mil.tz":true,"mobi.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"tv.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"cherkasy.ua":true,"chernigov.ua":true,"chernihiv.ua":true,"chernivtsi.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"cr.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"dnipropetrovsk.ua":true,"dominic.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkiv.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"khmelnytskyi.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"krym.ua":true,"ks.ua":true,"kv.ua":true,"kyiv.ua":true,"lg.ua":true,"lt.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lv.ua":true,"lviv.ua":true,"mk.ua":true,"mykolaiv.ua":true,"nikolaev.ua":true,"od.ua":true,"odesa.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rivne.ua":true,"rovno.ua":true,"rv.ua":true,"sb.ua":true,"sebastopol.ua":true,"sevastopol.ua":true,"sm.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uz.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vinnytsia.ua":true,"vn.ua":true,"volyn.ua":true,"yalta.ua":true,"zaporizhzhe.ua":true,"zaporizhzhia.ua":true,"zhitomir.ua":true,"zhytomyr.ua":true,"zp.ua":true,"zt.ua":true,"co.ua":true,"pp.ua":true,"ug":true,"co.ug":true,"or.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"com.ug":true,"org.ug":true,"uk":true,"ac.uk":true,"co.uk":true,"gov.uk":true,"ltd.uk":true,"me.uk":true,"net.uk":true,"nhs.uk":true,"org.uk":true,"plc.uk":true,"police.uk":true,"*.sch.uk":true,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.de.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"uy":true,"com.uy":true,"edu.uy":true,"gub.uy":true,"mil.uy":true,"net.uy":true,"org.uy":true,"uz":true,"co.uz":true,"com.uz":true,"net.uz":true,"org.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"ve":true,"arts.ve":true,"co.ve":true,"com.ve":true,"e12.ve":true,"edu.ve":true,"firm.ve":true,"gob.ve":true,"gov.ve":true,"info.ve":true,"int.ve":true,"mil.ve":true,"net.ve":true,"org.ve":true,"rec.ve":true,"store.ve":true,"tec.ve":true,"web.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"com.vu":true,"edu.vu":true,"net.vu":true,"org.vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--54b7fta0cc":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--node":true,"xn--j6w193g":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--80ao21a":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--l1acc":true,"xn--mgbx4cd0ab":true,"xn--mgb9awbf":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--o1ac.xn--90a3ac":true,"xn--c1avg.xn--90a3ac":true,"xn--90azh.xn--90a3ac":true,"xn--d1at.xn--90a3ac":true,"xn--o1ach.xn--90a3ac":true,"xn--80au.xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"*.za":true,"*.zm":true,"*.zw":true,"aaa":true,"abb":true,"abbott":true,"abogado":true,"academy":true,"accenture":true,"accountant":true,"accountants":true,"aco":true,"active":true,"actor":true,"ads":true,"adult":true,"aeg":true,"afl":true,"africa":true,"africamagic":true,"agency":true,"aig":true,"airforce":true,"airtel":true,"alibaba":true,"alipay":true,"allfinanz":true,"alsace":true,"amsterdam":true,"analytics":true,"android":true,"anquan":true,"apartments":true,"aquarelle":true,"aramco":true,"archi":true,"army":true,"arte":true,"associates":true,"attorney":true,"auction":true,"audio":true,"author":true,"auto":true,"autos":true,"avianca":true,"axa":true,"azure":true,"baidu":true,"band":true,"bank":true,"bar":true,"barcelona":true,"barclaycard":true,"barclays":true,"bargains":true,"bauhaus":true,"bayern":true,"bbc":true,"bbva":true,"bcg":true,"bcn":true,"beer":true,"bentley":true,"berlin":true,"best":true,"bharti":true,"bible":true,"bid":true,"bike":true,"bing":true,"bingo":true,"bio":true,"black":true,"blackfriday":true,"bloomberg":true,"blue":true,"bms":true,"bmw":true,"bnl":true,"bnpparibas":true,"boats":true,"bom":true,"bond":true,"boo":true,"boots":true,"bot":true,"boutique":true,"bradesco":true,"bridgestone":true,"broadway":true,"broker":true,"brother":true,"brussels":true,"budapest":true,"build":true,"builders":true,"business":true,"buy":true,"buzz":true,"bzh":true,"cab":true,"cafe":true,"cal":true,"call":true,"camera":true,"camp":true,"cancerresearch":true,"canon":true,"capetown":true,"capital":true,"car":true,"caravan":true,"cards":true,"care":true,"career":true,"careers":true,"cars":true,"cartier":true,"casa":true,"cash":true,"casino":true,"catering":true,"cba":true,"cbn":true,"center":true,"ceo":true,"cern":true,"cfa":true,"cfd":true,"channel":true,"chat":true,"cheap":true,"chloe":true,"christmas":true,"chrome":true,"church":true,"cipriani":true,"circle":true,"cisco":true,"citic":true,"city":true,"cityeats":true,"claims":true,"cleaning":true,"click":true,"clinic":true,"clothing":true,"club":true,"coach":true,"codes":true,"coffee":true,"college":true,"cologne":true,"commbank":true,"community":true,"company":true,"computer":true,"comsec":true,"condos":true,"construction":true,"consulting":true,"contact":true,"contractors":true,"cooking":true,"cool":true,"corsica":true,"country":true,"coupon":true,"coupons":true,"courses":true,"credit":true,"creditcard":true,"creditunion":true,"cricket":true,"crown":true,"crs":true,"cruises":true,"csc":true,"cuisinella":true,"cymru":true,"cyou":true,"dabur":true,"dad":true,"dance":true,"date":true,"dating":true,"datsun":true,"day":true,"dclk":true,"dealer":true,"deals":true,"degree":true,"delivery":true,"dell":true,"delta":true,"democrat":true,"dental":true,"dentist":true,"desi":true,"design":true,"dev":true,"diamonds":true,"diet":true,"digital":true,"direct":true,"directory":true,"discount":true,"dnp":true,"docs":true,"dog":true,"doha":true,"domains":true,"doosan":true,"download":true,"drive":true,"dstv":true,"dubai":true,"durban":true,"dvag":true,"earth":true,"eat":true,"edeka":true,"education":true,"email":true,"emerck":true,"energy":true,"engineer":true,"engineering":true,"enterprises":true,"epson":true,"equipment":true,"erni":true,"esq":true,"estate":true,"eurovision":true,"eus":true,"events":true,"everbank":true,"exchange":true,"expert":true,"exposed":true,"express":true,"fage":true,"fail":true,"fairwinds":true,"faith":true,"family":true,"fan":true,"fans":true,"farm":true,"fashion":true,"fast":true,"feedback":true,"ferrero":true,"film":true,"final":true,"finance":true,"financial":true,"firestone":true,"firmdale":true,"fish":true,"fishing":true,"fit":true,"fitness":true,"flickr":true,"flights":true,"florist":true,"flowers":true,"flsmidth":true,"fly":true,"foo":true,"football":true,"ford":true,"forex":true,"forsale":true,"forum":true,"foundation":true,"frl":true,"frogans":true,"frontier":true,"fund":true,"furniture":true,"futbol":true,"fyi":true,"gal":true,"gallery":true,"gallup":true,"garden":true,"gbiz":true,"gdn":true,"gea":true,"gent":true,"genting":true,"ggee":true,"gift":true,"gifts":true,"gives":true,"giving":true,"glass":true,"gle":true,"global":true,"globo":true,"gmail":true,"gmo":true,"gmx":true,"gold":true,"goldpoint":true,"golf":true,"goo":true,"goog":true,"google":true,"gop":true,"got":true,"gotv":true,"graphics":true,"gratis":true,"green":true,"gripe":true,"group":true,"gucci":true,"guge":true,"guide":true,"guitars":true,"guru":true,"hamburg":true,"hangout":true,"haus":true,"hdfcbank":true,"health":true,"healthcare":true,"help":true,"helsinki":true,"here":true,"hermes":true,"hiphop":true,"hitachi":true,"hiv":true,"hockey":true,"holdings":true,"holiday":true,"homedepot":true,"homes":true,"honda":true,"horse":true,"host":true,"hosting":true,"hoteles":true,"hotmail":true,"house":true,"how":true,"hsbc":true,"htc":true,"ibm":true,"icbc":true,"ice":true,"icu":true,"ifm":true,"iinet":true,"immo":true,"immobilien":true,"industries":true,"infiniti":true,"ing":true,"ink":true,"institute":true,"insurance":true,"insure":true,"international":true,"investments":true,"ipiranga":true,"irish":true,"iselect":true,"ist":true,"istanbul":true,"itau":true,"iwc":true,"jaguar":true,"java":true,"jcb":true,"jetzt":true,"jewelry":true,"jio":true,"jlc":true,"jll":true,"jmp":true,"joburg":true,"jot":true,"joy":true,"jprs":true,"juegos":true,"kaufen":true,"kddi":true,"kfh":true,"kim":true,"kinder":true,"kitchen":true,"kiwi":true,"koeln":true,"komatsu":true,"kpn":true,"krd":true,"kred":true,"kyknet":true,"kyoto":true,"lacaixa":true,"lancaster":true,"land":true,"landrover":true,"lasalle":true,"lat":true,"latrobe":true,"law":true,"lawyer":true,"lds":true,"lease":true,"leclerc":true,"legal":true,"lgbt":true,"liaison":true,"lidl":true,"life":true,"lifeinsurance":true,"lifestyle":true,"lighting":true,"like":true,"limited":true,"limo":true,"lincoln":true,"linde":true,"link":true,"live":true,"lixil":true,"loan":true,"loans":true,"lol":true,"london":true,"lotte":true,"lotto":true,"love":true,"ltd":true,"ltda":true,"lupin":true,"luxe":true,"luxury":true,"madrid":true,"maif":true,"maison":true,"makeup":true,"man":true,"management":true,"mango":true,"market":true,"marketing":true,"markets":true,"marriott":true,"mba":true,"media":true,"meet":true,"melbourne":true,"meme":true,"memorial":true,"men":true,"menu":true,"meo":true,"miami":true,"microsoft":true,"mini":true,"mma":true,"mnet":true,"mobily":true,"moda":true,"moe":true,"moi":true,"monash":true,"money":true,"montblanc":true,"mormon":true,"mortgage":true,"moscow":true,"motorcycles":true,"mov":true,"movie":true,"movistar":true,"mtn":true,"mtpc":true,"mtr":true,"multichoice":true,"mutual":true,"mzansimagic":true,"nadex":true,"nagoya":true,"naspers":true,"natura":true,"navy":true,"nec":true,"netbank":true,"network":true,"neustar":true,"new":true,"news":true,"nexus":true,"ngo":true,"nhk":true,"nico":true,"ninja":true,"nissan":true,"nokia":true,"norton":true,"nowruz":true,"nra":true,"nrw":true,"ntt":true,"nyc":true,"obi":true,"office":true,"okinawa":true,"omega":true,"one":true,"ong":true,"onl":true,"online":true,"ooo":true,"oracle":true,"orange":true,"organic":true,"orientexpress":true,"osaka":true,"otsuka":true,"ovh":true,"page":true,"pamperedchef":true,"panerai":true,"paris":true,"pars":true,"partners":true,"parts":true,"party":true,"passagens":true,"payu":true,"pharmacy":true,"philips":true,"photo":true,"photography":true,"photos":true,"physio":true,"piaget":true,"pics":true,"pictet":true,"pictures":true,"pid":true,"pin":true,"pink":true,"pizza":true,"place":true,"play":true,"plumbing":true,"plus":true,"pohl":true,"poker":true,"porn":true,"praxi":true,"press":true,"prod":true,"productions":true,"prof":true,"promo":true,"properties":true,"property":true,"pub":true,"qpon":true,"quebec":true,"quest":true,"racing":true,"read":true,"realtor":true,"realty":true,"recipes":true,"red":true,"redstone":true,"redumbrella":true,"rehab":true,"reise":true,"reisen":true,"reit":true,"reliance":true,"ren":true,"rent":true,"rentals":true,"repair":true,"report":true,"republican":true,"rest":true,"restaurant":true,"review":true,"reviews":true,"rich":true,"ricoh":true,"ril":true,"rio":true,"rip":true,"rocher":true,"rocks":true,"rodeo":true,"room":true,"rsvp":true,"ruhr":true,"run":true,"rwe":true,"ryukyu":true,"saarland":true,"safe":true,"safety":true,"sakura":true,"sale":true,"salon":true,"samsung":true,"sandvik":true,"sandvikcoromant":true,"sanofi":true,"sap":true,"sapo":true,"sarl":true,"sas":true,"saxo":true,"sbi":true,"sbs":true,"sca":true,"scb":true,"schmidt":true,"scholarships":true,"school":true,"schule":true,"schwarz":true,"science":true,"scor":true,"scot":true,"seat":true,"seek":true,"sener":true,"services":true,"sew":true,"sex":true,"sexy":true,"sharp":true,"shia":true,"shiksha":true,"shoes":true,"shouji":true,"show":true,"shriram":true,"sina":true,"singles":true,"site":true,"skin":true,"sky":true,"skype":true,"smile":true,"sncf":true,"soccer":true,"social":true,"software":true,"sohu":true,"solar":true,"solutions":true,"song":true,"sony":true,"soy":true,"space":true,"spiegel":true,"spot":true,"spreadbetting":true,"stada":true,"star":true,"starhub":true,"statebank":true,"statoil":true,"stc":true,"stcgroup":true,"stockholm":true,"storage":true,"studio":true,"study":true,"style":true,"sucks":true,"supersport":true,"supplies":true,"supply":true,"support":true,"surf":true,"surgery":true,"suzuki":true,"swatch":true,"swiss":true,"sydney":true,"symantec":true,"systems":true,"tab":true,"taipei":true,"taobao":true,"tatamotors":true,"tatar":true,"tattoo":true,"tax":true,"taxi":true,"tci":true,"team":true,"tech":true,"technology":true,"telecity":true,"telefonica":true,"temasek":true,"tennis":true,"thd":true,"theater":true,"tickets":true,"tienda":true,"tiffany":true,"tips":true,"tires":true,"tirol":true,"tmall":true,"today":true,"tokyo":true,"tools":true,"top":true,"toray":true,"toshiba":true,"tours":true,"town":true,"toys":true,"trade":true,"trading":true,"training":true,"travelers":true,"travelersinsurance":true,"trust":true,"trv":true,"tui":true,"tunes":true,"tushu":true,"tvs":true,"ubs":true,"university":true,"uno":true,"uol":true,"vacations":true,"vana":true,"vegas":true,"ventures":true,"versicherung":true,"vet":true,"viajes":true,"video":true,"viking":true,"villas":true,"vip":true,"virgin":true,"vision":true,"vista":true,"vistaprint":true,"viva":true,"vlaanderen":true,"vodka":true,"vote":true,"voting":true,"voto":true,"voyage":true,"vuelos":true,"wales":true,"walter":true,"wang":true,"wanggou":true,"watch":true,"watches":true,"weather":true,"weatherchannel":true,"webcam":true,"website":true,"wed":true,"wedding":true,"weibo":true,"weir":true,"whoswho":true,"wien":true,"wiki":true,"williamhill":true,"win":true,"windows":true,"wme":true,"work":true,"works":true,"world":true,"wtc":true,"wtf":true,"xbox":true,"xerox":true,"xihuan":true,"xin":true,"xn--11b4c3d":true,"xn--1ck2e1b":true,"xn--1qqw23a":true,"xn--30rr7y":true,"xn--3bst00m":true,"xn--3ds443g":true,"xn--3pxu8k":true,"xn--42c2d9a":true,"xn--45q11c":true,"xn--4gbrim":true,"xn--55qw42g":true,"xn--55qx5d":true,"xn--5tzm5g":true,"xn--6frz82g":true,"xn--6qq986b3xl":true,"xn--80adxhks":true,"xn--80asehdb":true,"xn--80aswg":true,"xn--8y0a063a":true,"xn--9dbq2a":true,"xn--9et52u":true,"xn--9krt00a":true,"xn--b4w605ferd":true,"xn--bck1b9a5dre4c":true,"xn--c1avg":true,"xn--c2br7g":true,"xn--cck2b3b":true,"xn--cg4bki":true,"xn--czr694b":true,"xn--czrs0t":true,"xn--czru2d":true,"xn--d1acj3b":true,"xn--eckvdtc9d":true,"xn--efvy88h":true,"xn--estv75g":true,"xn--fhbei":true,"xn--fiq228c5hs":true,"xn--fiq64b":true,"xn--fjq720a":true,"xn--flw351e":true,"xn--g2xx48c":true,"xn--gckr3f0f":true,"xn--hxt814e":true,"xn--i1b6b1a6a2e":true,"xn--imr513n":true,"xn--io0a7i":true,"xn--j1aef":true,"xn--jlq61u9w7b":true,"xn--jvr189m":true,"xn--kcrx77d1x4a":true,"xn--kpu716f":true,"xn--kput3i":true,"xn--mgba3a3ejt":true,"xn--mgbab2bd":true,"xn--mgbb9fbpob":true,"xn--mgbt3dhd":true,"xn--mk1bu44c":true,"xn--mxtq1m":true,"xn--ngbc5azd":true,"xn--ngbe9e0a":true,"xn--nqv7f":true,"xn--nqv7fs00ema":true,"xn--nyqy26a":true,"xn--p1acf":true,"xn--pbt977c":true,"xn--pssy2u":true,"xn--q9jyb4c":true,"xn--qcka1pmc":true,"xn--rhqv96g":true,"xn--rovu88b":true,"xn--ses554g":true,"xn--t60b56a":true,"xn--tckwe":true,"xn--unup4y":true,"xn--vermgensberater-ctb":true,"xn--vermgensberatung-pwb":true,"xn--vhquv":true,"xn--vuq861b":true,"xn--xhq521b":true,"xn--zfr164b":true,"xyz":true,"yachts":true,"yahoo":true,"yamaxun":true,"yandex":true,"yodobashi":true,"yoga":true,"yokohama":true,"youtube":true,"yun":true,"zara":true,"zero":true,"zip":true,"zone":true,"zuerich":true,"cloudfront.net":true,"ap-northeast-1.compute.amazonaws.com":true,"ap-southeast-1.compute.amazonaws.com":true,"ap-southeast-2.compute.amazonaws.com":true,"cn-north-1.compute.amazonaws.cn":true,"compute.amazonaws.cn":true,"compute.amazonaws.com":true,"compute-1.amazonaws.com":true,"eu-west-1.compute.amazonaws.com":true,"eu-central-1.compute.amazonaws.com":true,"sa-east-1.compute.amazonaws.com":true,"us-east-1.amazonaws.com":true,"us-gov-west-1.compute.amazonaws.com":true,"us-west-1.compute.amazonaws.com":true,"us-west-2.compute.amazonaws.com":true,"z-1.compute-1.amazonaws.com":true,"z-2.compute-1.amazonaws.com":true,"elasticbeanstalk.com":true,"elb.amazonaws.com":true,"s3.amazonaws.com":true,"s3-us-west-2.amazonaws.com":true,"s3-us-west-1.amazonaws.com":true,"s3-eu-west-1.amazonaws.com":true,"s3-ap-southeast-1.amazonaws.com":true,"s3-ap-southeast-2.amazonaws.com":true,"s3-ap-northeast-1.amazonaws.com":true,"s3-sa-east-1.amazonaws.com":true,"s3-us-gov-west-1.amazonaws.com":true,"s3-fips-us-gov-west-1.amazonaws.com":true,"s3-website-us-east-1.amazonaws.com":true,"s3-website-us-west-2.amazonaws.com":true,"s3-website-us-west-1.amazonaws.com":true,"s3-website-eu-west-1.amazonaws.com":true,"s3-website-ap-southeast-1.amazonaws.com":true,"s3-website-ap-southeast-2.amazonaws.com":true,"s3-website-ap-northeast-1.amazonaws.com":true,"s3-website-sa-east-1.amazonaws.com":true,"s3-website-us-gov-west-1.amazonaws.com":true,"betainabox.com":true,"ae.org":true,"ar.com":true,"br.com":true,"cn.com":true,"com.de":true,"com.se":true,"de.com":true,"eu.com":true,"gb.com":true,"gb.net":true,"hu.com":true,"hu.net":true,"jp.net":true,"jpn.com":true,"kr.com":true,"mex.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"se.net":true,"uk.com":true,"uk.net":true,"us.com":true,"uy.com":true,"za.bz":true,"za.com":true,"africa.com":true,"gr.com":true,"in.net":true,"us.org":true,"co.com":true,"c.la":true,"cloudcontrolled.com":true,"cloudcontrolapp.com":true,"co.ca":true,"co.nl":true,"co.no":true,"*.platform.sh":true,"cupcake.is":true,"dreamhosters.com":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true,"a.ssl.fastly.net":true,"b.ssl.fastly.net":true,"global.ssl.fastly.net":true,"a.prod.fastly.net":true,"global.prod.fastly.net":true,"firebaseapp.com":true,"flynnhub.com":true,"service.gov.uk":true,"github.io":true,"githubusercontent.com":true,"ro.com":true,"appspot.com":true,"blogspot.ae":true,"blogspot.be":true,"blogspot.bj":true,"blogspot.ca":true,"blogspot.cf":true,"blogspot.ch":true,"blogspot.co.at":true,"blogspot.co.il":true,"blogspot.co.nz":true,"blogspot.co.uk":true,"blogspot.com":true,"blogspot.com.ar":true,"blogspot.com.au":true,"blogspot.com.br":true,"blogspot.com.es":true,"blogspot.com.tr":true,"blogspot.cv":true,"blogspot.cz":true,"blogspot.de":true,"blogspot.dk":true,"blogspot.fi":true,"blogspot.fr":true,"blogspot.gr":true,"blogspot.hk":true,"blogspot.hu":true,"blogspot.ie":true,"blogspot.in":true,"blogspot.it":true,"blogspot.jp":true,"blogspot.kr":true,"blogspot.mr":true,"blogspot.mx":true,"blogspot.nl":true,"blogspot.no":true,"blogspot.pt":true,"blogspot.re":true,"blogspot.ro":true,"blogspot.ru":true,"blogspot.se":true,"blogspot.sg":true,"blogspot.sk":true,"blogspot.td":true,"blogspot.tw":true,"codespot.com":true,"googleapis.com":true,"googlecode.com":true,"pagespeedmobilizer.com":true,"withgoogle.com":true,"herokuapp.com":true,"herokussl.com":true,"iki.fi":true,"biz.at":true,"info.at":true,"co.pl":true,"azurewebsites.net":true,"azure-mobile.net":true,"cloudapp.net":true,"nfshost.com":true,"nyc.mn":true,"nid.io":true,"operaunite.com":true,"outsystemscloud.com":true,"art.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"priv.at":true,"rhcloud.com":true,"sinaapp.com":true,"vipsinaapp.com":true,"1kapp.com":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"hk.com":true,"hk.org":true,"ltd.hk":true,"inc.hk":true,"yolasite.com":true,"za.net":true,"za.org":true});
// END of automatically generated file
diff --git a/node_modules/request/node_modules/tough-cookie/lib/store.js b/node_modules/request/node_modules/tough-cookie/lib/store.js
index f8433dfcb..ad69c14d3 100644
--- a/node_modules/request/node_modules/tough-cookie/lib/store.js
+++ b/node_modules/request/node_modules/tough-cookie/lib/store.js
@@ -1,3 +1,33 @@
+/*!
+ * 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';
/*jshint unused:false */
diff --git a/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt b/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt
deleted file mode 100644
index a41e0a7ef..000000000
--- a/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright Mathias Bynens <https://mathiasbynens.be/>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-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/request/node_modules/tough-cookie/node_modules/punycode/README.md b/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md
deleted file mode 100644
index 831e6379b..000000000
--- a/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md
+++ /dev/null
@@ -1,176 +0,0 @@
-# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/coveralls/bestiejs/punycode.js/master.svg)](https://coveralls.io/r/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js)
-
-A robust Punycode converter that fully complies to [RFC 3492](http://tools.ietf.org/html/rfc3492) and [RFC 5891](http://tools.ietf.org/html/rfc5891), and works on nearly all JavaScript platforms.
-
-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](http://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 is [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with [Node.js v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc).
-
-## Installation
-
-Via [npm](http://npmjs.org/) (only required for Node.js releases older than v0.6.2):
-
-```bash
-npm install punycode
-```
-
-Via [Bower](http://bower.io/):
-
-```bash
-bower install punycode
-```
-
-Via [Component](https://github.com/component/component):
-
-```bash
-component install bestiejs/punycode.js
-```
-
-In a browser:
-
-```html
-<script src="punycode.js"></script>
-```
-
-In [Narwhal](http://narwhaljs.org/), [Node.js](http://nodejs.org/), and [RingoJS](http://ringojs.org/):
-
-```js
-var punycode = require('punycode');
-```
-
-In [Rhino](http://www.mozilla.org/rhino/):
-
-```js
-load('punycode.js');
-```
-
-Using an AMD loader like [RequireJS](http://requirejs.org/):
-
-```js
-require(
- {
- 'paths': {
- 'punycode': 'path/to/punycode'
- }
- },
- ['punycode'],
- function(punycode) {
- console.log(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 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.
-
-## Unit tests & code coverage
-
-After cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.
-
-Once that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use `grunt test`.
-
-To generate the code coverage report, use `grunt cover`.
-
-Feel free to fork if you see possible improvements!
-
-## Author
-
-| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") |
-|---|
-| [Mathias Bynens](https://mathiasbynens.be/) |
-
-## Contributors
-
-| [![twitter/jdalton](https://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") |
-|---|
-| [John-David Dalton](http://allyoucanleet.com/) |
-
-## License
-
-Punycode.js is available under the [MIT](https://mths.be/mit) license.
diff --git a/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json b/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json
deleted file mode 100644
index fa3ba2117..000000000
--- a/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "name": "punycode",
- "version": "1.3.2",
- "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",
- "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/"
- },
- {
- "name": "John-David Dalton",
- "url": "http://allyoucanleet.com/"
- }
- ],
- "repository": {
- "type": "git",
- "url": "https://github.com/bestiejs/punycode.js.git"
- },
- "bugs": {
- "url": "https://github.com/bestiejs/punycode.js/issues"
- },
- "files": [
- "LICENSE-MIT.txt",
- "punycode.js"
- ],
- "scripts": {
- "test": "node tests/tests.js"
- },
- "devDependencies": {
- "coveralls": "^2.10.1",
- "grunt": "^0.4.5",
- "grunt-contrib-uglify": "^0.5.0",
- "grunt-shell": "^0.7.0",
- "istanbul": "^0.2.13",
- "qunit-extras": "^1.2.0",
- "qunitjs": "~1.11.0",
- "requirejs": "^2.1.14"
- },
- "gitHead": "38c8d3131a82567bfef18da09f7f4db68c84f8a3",
- "_id": "punycode@1.3.2",
- "_shasum": "9653a036fb7c1ee42342f2325cceefea3926c48d",
- "_from": "punycode@>=0.2.0",
- "_npmVersion": "1.4.28",
- "_npmUser": {
- "name": "mathias",
- "email": "mathias@qiwi.be"
- },
- "maintainers": [
- {
- "name": "mathias",
- "email": "mathias@qiwi.be"
- },
- {
- "name": "reconbot",
- "email": "wizard@roborooter.com"
- }
- ],
- "dist": {
- "shasum": "9653a036fb7c1ee42342f2325cceefea3926c48d",
- "tarball": "http://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
- },
- "directories": {},
- "_resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
-}
diff --git a/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js b/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js
deleted file mode 100644
index ac6859738..000000000
--- a/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js
+++ /dev/null
@@ -1,530 +0,0 @@
-/*! https://mths.be/punycode v1.3.2 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 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 <https://mathiasbynens.be/notes/javascript-encoding>
- * @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.
- * http://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 <n,i> state to <m,0>,
- // 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.3.2',
- /**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to Unicode code points, and back.
- * @see <https://mathiasbynens.be/notes/javascript-encoding>
- * @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 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));
diff --git a/node_modules/request/node_modules/tough-cookie/package.json b/node_modules/request/node_modules/tough-cookie/package.json
index f4ede6689..96d8d1d16 100644
--- a/node_modules/request/node_modules/tough-cookie/package.json
+++ b/node_modules/request/node_modules/tough-cookie/package.json
@@ -1,8 +1,9 @@
{
"author": {
- "name": "GoInstant Inc., a salesforce.com company"
+ "name": "Jeremy Stashewsky",
+ "email": "jstashewsky@salesforce.com"
},
- "license": "MIT",
+ "license": "BSD-3-Clause",
"name": "tough-cookie",
"description": "RFC6265 Cookies and Cookie Jar for node.js",
"keywords": [
@@ -15,41 +16,39 @@
"RFC6265",
"RFC2965"
],
- "version": "0.12.1",
- "homepage": "https://github.com/goinstant/tough-cookie",
+ "version": "1.2.0",
+ "homepage": "https://github.com/SalesforceEng/tough-cookie",
"repository": {
"type": "git",
- "url": "git://github.com/goinstant/tough-cookie.git"
+ "url": "git://github.com/SalesforceEng/tough-cookie.git"
},
"bugs": {
- "url": "https://github.com/goinstant/tough-cookie/issues"
+ "url": "https://github.com/SalesforceEng/tough-cookie/issues"
},
"main": "./lib/cookie",
"scripts": {
- "test": "vows test.js"
+ "test": "vows test/*_test.js"
},
"engines": {
- "node": ">=0.4.12"
- },
- "dependencies": {
- "punycode": ">=0.2.0"
+ "node": ">=0.10.0"
},
"devDependencies": {
"vows": "0.7.0",
"async": ">=0.1.12"
},
- "readme": "[RFC6265](http://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js\n\n![Tough Cookie](http://www.goinstant.com.s3.amazonaws.com/tough-cookie.jpg)\n\n[![Build Status](https://travis-ci.org/goinstant/node-cookie.png?branch=master)](https://travis-ci.org/goinstant/node-cookie)\n\n[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie)\n![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9)\n\n# Synopsis\n\n``` javascript\nvar tough = require('tough-cookie'); // note: not 'cookie', 'cookies' or 'node-cookie'\nvar Cookie = tough.Cookie;\nvar cookie = Cookie.parse(header);\ncookie.value = 'somethingdifferent';\nheader = cookie.toString();\n\nvar cookiejar = new tough.CookieJar();\ncookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb);\n// ...\ncookiejar.getCookies('http://example.com/otherpath',function(err,cookies) {\n res.headers['cookie'] = cookies.join('; ');\n});\n```\n\n# Installation\n\nIt's _so_ easy!\n\n`npm install tough-cookie`\n\nRequires `punycode`, which should get installed automatically for you. Note that node.js v0.6.2+ bundles punycode by default.\n\nWhy the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken.\n\n# API\n\ntough\n=====\n\nFunctions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be \"bound\".\n\nparseDate(string[,strict])\n-----------------\n\nParse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. If strict is set to true then leading/trailing non-seperator characters around the time part will cause the parsing to fail (e.g. \"Thu, 01 Jan 1970 00:00:010 GMT\" has an extra trailing zero but Chrome, an assumedly RFC-compliant browser, treats this as valid).\n\nformatDate(date)\n----------------\n\nFormat a Date into a RFC1123 string (the RFC6265-recommended format).\n\ncanonicalDomain(str)\n--------------------\n\nTransforms 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).\n\ndomainMatch(str,domStr[,canonicalize=true])\n-------------------------------------------\n\nAnswers \"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\".\n\nThe `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not.\n\ndefaultPath(path)\n-----------------\n\nGiven 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.\n\nThe `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.\n\npathMatch(reqPath,cookiePath)\n-----------------------------\n\nAnswers \"does the request-path path-match a given cookie-path?\" as per RFC6265 Section 5.1.4. Returns a boolean.\n\nThis is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`.\n\nparse(header[,strict=false])\n----------------------------\n\nalias for `Cookie.parse(header[,strict])`\n\nfromJSON(string)\n----------------\n\nalias for `Cookie.fromJSON(string)`\n\ngetPublicSuffix(hostname)\n-------------------------\n\nReturns 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.\n\nFor example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`.\n\nFor further information, see http://publicsuffix.org/. This module derives its list from that site.\n\ncookieCompare(a,b)\n------------------\n\nFor use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). Longest `.path`s go first, then sorted oldest to youngest.\n\n``` javascript\nvar cookies = [ /* unsorted array of Cookie objects */ ];\ncookies = cookies.sort(cookieCompare);\n```\n\npermuteDomain(domain)\n---------------------\n\nGenerates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores.\n\n\npermutePath(path)\n-----------------\n\nGenerates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores.\n\nCookie\n======\n\nCookie.parse(header[,strict=false])\n-----------------------------------\n\nParses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. If in strict mode, returns `undefined` if the cookie doesn't follow the guidelines in section 4 of RFC6265. Generally speaking, strict mode can be used to validate your own generated Set-Cookie headers, but acting as a client you want to be lenient and leave strict mode off.\n\nHere's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response:\n\n``` javascript\nif (res.headers['set-cookie'] instanceof Array)\n cookies = res.headers['set-cookie'].map(function (c) { return (Cookie.parse(c)); });\nelse\n cookies = [Cookie.parse(res.headers['set-cookie'])];\n```\n\nCookie.fromJSON(string)\n-----------------------\n\nConvert a JSON string to a `Cookie` object. Does a `JSON.parse()` and converts the `.created`, `.lastAccessed` and `.expires` properties into `Date` objects.\n\nProperties\n==========\n\n * _key_ - string - the name or key of the cookie (default \"\")\n * _value_ - string - the value of the cookie (default \"\")\n * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `\"Infinity\"`). See `setExpires()`\n * _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()`\n * _domain_ - string - the `Domain=` attribute of the cookie\n * _path_ - string - the `Path=` of the cookie\n * _secure_ - boolean - the `Secure` cookie flag\n * _httpOnly_ - boolean - the `HttpOnly` cookie flag\n * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside)\n\nAfter a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes:\n\n * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied)\n * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one.\n * _created_ - `Date` - when this cookie was added to the jar\n * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute.\n\nConstruction([{options}])\n------------\n\nReceives an options object that can contain any Cookie properties, uses the default for unspecified properties.\n\n.toString()\n-----------\n\nencode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`.\n\n.cookieString()\n---------------\n\nencode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '=').\n\n.setExpires(String)\n-------------------\n\nsets 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.\n\n.setMaxAge(number)\n-------------------\n\nsets the maxAge in seconds. Coerces `-Infinity` to `\"-Infinity\"` and `Infinity` to `\"Infinity\"` so it JSON serializes correctly.\n\n.expiryTime([now=Date.now()])\n-----------------------------\n\n.expiryDate([now=Date.now()])\n-----------------------------\n\nexpiryTime() 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.\n\nMax-Age takes precedence over Expires (as per the RFC). The `.created` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute.\n\nIf Expires (`.expires`) is set, that's returned.\n\nOtherwise, `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).\n\n.TTL([now=Date.now()])\n---------\n\ncompute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply.\n\nThe \"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.\n\n.canonicalizedDoman()\n---------------------\n\n.cdomain()\n----------\n\nreturn the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters.\n\n.validate()\n-----------\n\nStatus: *IN PROGRESS*. Works for a few things, but is by no means comprehensive.\n\nvalidates 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:\n\n``` javascript\nif (cookie.validate() === true) {\n // it's tasty\n} else {\n // yuck!\n}\n```\n\nCookieJar\n=========\n\nConstruction([store = new MemoryCookieStore()][, rejectPublicSuffixes])\n------------\n\nSimply 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.\n\n\nAttributes\n----------\n\n * _rejectPublicSuffixes_ - boolean - reject cookies with domains like \"com\" and \"co.uk\" (default: `true`)\n\nSince eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods.\n\n.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))\n-------------------------------------------------------------------\n\nAttempt 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 `.created`, `.lastAccessed` and `.hostOnly` properties.\n\nThe `options` object can be omitted and can have the following properties:\n\n * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies.\n * _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`.\n * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies\n * _strict_ - boolean - default `false` - perform extra checks\n * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. CookieStore errors aren't ignored by this option.\n\nAs 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).\n\n.setCookieSync(cookieOrString, currentUrl, [{options}])\n-------------------------------------------------------\n\nSynchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.storeCookie(cookie, [{options},] cb(err,cookie))\n-------------------------------------------------\n\n__REMOVED__ removed in lieu of the CookieStore API below\n\n.getCookies(currentUrl, [{options},] cb(err,cookies))\n-----------------------------------------------------\n\nRetrieve the list of cookies that can be sent in a Cookie header for the current url.\n\nIf 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.\n\nThe `options` object can be omitted and can have the following properties:\n\n * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies.\n * _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`.\n * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies\n * _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).\n * _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 CookieStore `fetchCookies` function (the default MemoryCookieStore supports it).\n\nThe `.lastAccessed` property of the returned cookies will have been updated.\n\n.getCookiesSync(currentUrl, [{options}])\n----------------------------------------\n\nSynchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.getCookieString(...)\n---------------------\n\nAccepts 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()`.\n\n.getCookieStringSync(...)\n-------------------------\n\nSynchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.getSetCookieStrings(...)\n-------------------------\n\nReturns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`.\n\n.getSetCookieStringsSync(...)\n-----------------------------\n\nSynchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\nStore\n=====\n\nBase class for CookieJar stores.\n\n# CookieStore API\n\nThe 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.\n\nStores 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, then the `*Sync` methods on the CookieJar can be used.\n\nAll `domain` parameters will have been normalized before calling.\n\nThe Cookie store must have all of the following methods.\n\nstore.findCookie(domain, path, key, cb(err,cookie))\n---------------------------------------------------\n\nRetrieve 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.\n\nCallback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error).\n\nstore.findCookies(domain, path, cb(err,cookies))\n------------------------------------------------\n\nLocates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above.\n\nIf no cookies are found, the callback MUST be passed an empty array.\n\nThe 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.\n\nAs 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).\n\nstore.putCookie(cookie, cb(err))\n--------------------------------\n\nAdds 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.\n\nThe `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties.\n\nPass an error if the cookie cannot be stored.\n\nstore.updateCookie(oldCookie, newCookie, cb(err))\n-------------------------------------------------\n\nUpdate 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.\n\nThe `.lastAccessed` property will always be different between the two objects and `.created` will always be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are sorted (or selected for deletion).\n\nStores 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.\n\nThe `newCookie` and `oldCookie` objects MUST NOT be modified.\n\nPass an error if the newCookie cannot be stored.\n\nstore.removeCookie(domain, path, key, cb(err))\n----------------------------------------------\n\nRemove a cookie from the store (see notes on `findCookie` about the uniqueness constraint).\n\nThe 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.\n\nstore.removeCookies(domain, path, cb(err))\n------------------------------------------\n\nRemoves matching cookies from the store. The `path` paramter is optional, and if missing means all paths in a domain should be removed.\n\nPass an error ONLY if removing any existing cookies failed.\n\n# TODO\n\n * _full_ RFC5890/RFC5891 canonicalization for domains in `cdomain()`\n * the optional `punycode` requirement implements RFC3492, but RFC6265 requires RFC5891\n * better tests for `validate()`?\n\n# Copyright and License\n\n(tl;dr: MIT with some MPL/1.1)\n\nCopyright 2012- GoInstant, Inc. and other contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\nPortions may be licensed under different licenses (in particular public-suffix.txt is MPL/1.1); please read the LICENSE file for full details.\n",
- "readmeFilename": "README.md",
- "_id": "tough-cookie@0.12.1",
- "dist": {
- "shasum": "8220c7e21abd5b13d96804254bd5a81ebf2c7d62",
- "tarball": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz"
- },
+ "gitHead": "74e59de50b719bb9a1b01c8c9db57fa31401ed1a",
+ "_id": "tough-cookie@1.2.0",
+ "_shasum": "9b7e9d98e769e80b5aa899d944fe44e02ebf82ad",
"_from": "tough-cookie@>=0.12.0",
- "_npmVersion": "1.3.11",
+ "_npmVersion": "2.7.4",
+ "_nodeVersion": "0.12.2",
"_npmUser": {
- "name": "goinstant",
- "email": "support@goinstant.com"
+ "name": "jstash",
+ "email": "jstash@gmail.com"
+ },
+ "dist": {
+ "shasum": "9b7e9d98e769e80b5aa899d944fe44e02ebf82ad",
+ "tarball": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-1.2.0.tgz"
},
"maintainers": [
{
@@ -62,6 +61,6 @@
}
],
"directories": {},
- "_shasum": "8220c7e21abd5b13d96804254bd5a81ebf2c7d62",
- "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz"
+ "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-1.2.0.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/node_modules/request/node_modules/tough-cookie/public-suffix.txt b/node_modules/request/node_modules/tough-cookie/public-suffix.txt
index 2c2013127..f8941f7ac 100644
--- a/node_modules/request/node_modules/tough-cookie/public-suffix.txt
+++ b/node_modules/request/node_modules/tough-cookie/public-suffix.txt
@@ -1,44 +1,6 @@
-// ***** BEGIN LICENSE BLOCK *****
-// Version: MPL 1.1/GPL 2.0/LGPL 2.1
-//
-// The contents of this file are subject to the Mozilla Public License Version
-// 1.1 (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.mozilla.org/MPL/
-//
-// Software distributed under the License is distributed on an "AS IS" basis,
-// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-// for the specific language governing rights and limitations under the
-// License.
-//
-// The Original Code is the Public Suffix List.
-//
-// The Initial Developer of the Original Code is
-// Jo Hermans <jo.hermans@gmail.com>.
-// Portions created by the Initial Developer are Copyright (C) 2007
-// the Initial Developer. All Rights Reserved.
-//
-// Contributor(s):
-// Ruben Arakelyan <ruben@rubenarakelyan.com>
-// Gervase Markham <gerv@gerv.net>
-// Pamela Greene <pamg.bugs@gmail.com>
-// David Triendl <david@triendl.name>
-// Jothan Frakes <jothan@gmail.com>
-// The kind representatives of many TLD registries
-//
-// Alternatively, the contents of this file may be used under the terms of
-// either the GNU General Public License Version 2 or later (the "GPL"), or
-// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-// in which case the provisions of the GPL or the LGPL are applicable instead
-// of those above. If you wish to allow use of your version of this file only
-// under the terms of either the GPL or the LGPL, and not to allow others to
-// use your version of this file under the terms of the MPL, indicate your
-// decision by deleting the provisions above and replace them with the notice
-// and other provisions required by the GPL or the LGPL. If you do not delete
-// the provisions above, a recipient may use your version of this file under
-// the terms of any one of the MPL, the GPL or the LGPL.
-//
-// ***** END LICENSE BLOCK *****
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// ===BEGIN ICANN DOMAINS===
@@ -213,20 +175,21 @@ it.ao
// aq : http://en.wikipedia.org/wiki/.aq
aq
-// ar : http://en.wikipedia.org/wiki/.ar
-*.ar
-!congresodelalengua3.ar
-!educ.ar
-!gobiernoelectronico.ar
-!mecon.ar
-!nacion.ar
-!nic.ar
-!promocion.ar
-!retina.ar
-!uba.ar
+// ar : https://nic.ar/normativa-vigente.xhtml
+ar
+com.ar
+edu.ar
+gob.ar
+gov.ar
+int.ar
+mil.ar
+net.ar
+org.ar
+tur.ar
// arpa : http://en.wikipedia.org/wiki/.arpa
// Confirmed by registry <iana-questions@icann.org> 2008-06-18
+arpa
e164.arpa
in-addr.arpa
ip6.arpa
@@ -251,13 +214,13 @@ or.at
// au : http://en.wikipedia.org/wiki/.au
// http://www.auda.org.au/
+au
// 2LDs
com.au
net.au
org.au
edu.au
gov.au
-csiro.au
asn.au
id.au
// Historic 2LDs (closed to new registration, but sites still exist)
@@ -282,10 +245,9 @@ sa.edu.au
tas.edu.au
vic.edu.au
wa.edu.au
-act.gov.au
-// Removed at request of Shae.Donelan@services.nsw.gov.au, 2010-03-04
-// nsw.gov.au
-nt.gov.au
+// act.gov.au Bug 984824 - Removed at request of Greg Tankard
+// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au>
+// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au>
qld.gov.au
sa.gov.au
tas.gov.au
@@ -330,6 +292,7 @@ rs.ba
// bb : http://en.wikipedia.org/wiki/.bb
bb
biz.bb
+co.bb
com.bb
edu.bb
gov.bb
@@ -337,6 +300,7 @@ info.bb
net.bb
org.bb
store.bb
+tv.bb
// bd : http://en.wikipedia.org/wiki/.bd
*.bd
@@ -388,7 +352,7 @@ z.bg
6.bg
7.bg
8.bg
-9.bg
+9.bg
// bh : http://en.wikipedia.org/wiki/.bh
bh
@@ -439,8 +403,8 @@ net.bo
mil.bo
tv.bo
-// br : http://registro.br/dominio/dpn.html
-// Updated by registry <fneves@registro.br> 2011-03-01
+// br : http://registro.br/dominio/categoria.html
+// Submitted by registry <fneves@registro.br> 2014-08-11
br
adm.br
adv.br
@@ -453,13 +417,13 @@ b.br
bio.br
blog.br
bmd.br
-can.br
cim.br
cng.br
cnt.br
com.br
coop.br
ecn.br
+eco.br
edu.br
emp.br
eng.br
@@ -480,13 +444,15 @@ ind.br
inf.br
jor.br
jus.br
+leg.br
lel.br
mat.br
med.br
mil.br
+mp.br
mus.br
net.br
-nom.br
+*.nom.br
not.br
ntr.br
odo.br
@@ -529,6 +495,7 @@ org.bt
// bv : No registrations at this time.
// Submitted by registry <jarle@uninett.no> 2006-06-16
+bv
// bw : http://en.wikipedia.org/wiki/.bw
// http://www.gobin.info/domainname/bw.doc
@@ -631,9 +598,12 @@ gob.cl
co.cl
mil.cl
-// cm : http://en.wikipedia.org/wiki/.cm
+// cm : http://en.wikipedia.org/wiki/.cm plus bug 981927
cm
+co.cm
+com.cm
gov.cm
+net.cm
// cn : http://en.wikipedia.org/wiki/.cn
// Submitted by registry <tanyaling@cnnic.cn> 2008-06-11
@@ -729,6 +699,14 @@ inf.cu
// cv : http://en.wikipedia.org/wiki/.cv
cv
+// cw : http://www.una.cw/cw_registry/
+// Confirmed by registry <registry@una.net> 2013-03-26
+cw
+com.cw
+edu.cw
+net.cw
+org.cw
+
// cx : http://en.wikipedia.org/wiki/.cx
// list of other 2nd level tlds ?
cx
@@ -817,7 +795,7 @@ org.ee
fie.ee
// eg : http://en.wikipedia.org/wiki/.eg
-eg
+eg
com.eg
edu.eg
eun.eg
@@ -840,7 +818,14 @@ gob.es
edu.es
// et : http://en.wikipedia.org/wiki/.et
-*.et
+et
+com.et
+gov.et
+org.et
+edu.et
+biz.et
+name.et
+info.et
// eu : http://en.wikipedia.org/wiki/.eu
eu
@@ -899,6 +884,7 @@ ga
// gb : This registry is effectively dormant
// Submitted by registry <Damien.Shaw@ja.net> 2008-06-12
+gb
// gd : http://en.wikipedia.org/wiki/.gd
gd
@@ -916,13 +902,12 @@ pvt.ge
// gf : http://en.wikipedia.org/wiki/.gf
gf
-// gg : http://www.channelisles.net/applic/avextn.shtml
+// gg : http://www.channelisles.net/register-domains/
+// Confirmed by registry <nigel@channelisles.net> 2013-11-28
gg
co.gg
-org.gg
net.gg
-sch.gg
-gov.gg
+org.gg
// gh : http://en.wikipedia.org/wiki/.gh
// see also: http://www.nic.gh/reg_now.php
@@ -953,6 +938,7 @@ gm
// gn : http://psg.com/dns/gn/gn.txt
// Submitted by registry <randy@psg.com> 2008-06-17
+gn
ac.gn
com.gn
edu.gn
@@ -987,9 +973,15 @@ gov.gr
// gs : http://en.wikipedia.org/wiki/.gs
gs
-// gt : http://www.gt/politicas.html
-*.gt
-!www.gt
+// gt : http://www.gt/politicas_de_registro.html
+gt
+com.gt
+edu.gt
+gob.gt
+ind.gt
+mil.gt
+net.gt
+org.gt
// gu : http://gadao.gov.gu/registration.txt
*.gu
@@ -1027,7 +1019,7 @@ org.hk
网絡.hk
组织.hk
組織.hk
-組织.hk
+組织.hk
// hm : http://en.wikipedia.org/wiki/.hm
hm
@@ -1103,13 +1095,15 @@ tozsde.hu
utazas.hu
video.hu
-// id : http://en.wikipedia.org/wiki/.id
-// see also: https://register.pandi.or.id/
+// id : https://register.pandi.or.id/
id
ac.id
+biz.id
co.id
+desa.id
go.id
mil.id
+my.id
net.id
or.id
sch.id
@@ -1122,19 +1116,21 @@ gov.ie
// il : http://en.wikipedia.org/wiki/.il
*.il
-// im : https://www.nic.im/pdfs/imfaqs.pdf
+// im : https://www.nic.im/
+// Submitted by registry <info@nic.im> 2013-11-15
im
+ac.im
co.im
+com.im
ltd.co.im
-plc.co.im
net.im
-gov.im
org.im
-nic.im
-ac.im
+plc.co.im
+tt.im
+tv.im
// in : http://en.wikipedia.org/wiki/.in
-// see also: http://www.inregistry.in/policies/
+// see also: https://registry.in/Policies
// Please note, that nic.in is not an offical eTLD, but used by most
// government institutions.
in
@@ -1203,294 +1199,385 @@ int.is
it
gov.it
edu.it
-// list of reserved geo-names :
+// Reserved geo-names:
// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf
-// (There is also a list of reserved geo-names corresponding to Italian
-// municipalities : http://www.nic.it/documenti/appendice-c.pdf , but it is
-// not included here.)
-agrigento.it
+// There is also a list of reserved geo-names corresponding to Italian municipalities
+// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here.
+// Regions
+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
+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-sudtirol.it
+trentino-sued-tirol.it
+trentino-suedtirol.it
+trentinoa-adige.it
+trentinoaadige.it
+trentinoalto-adige.it
+trentinoaltoadige.it
+trentinos-tirol.it
+trentinostirol.it
+trentinosud-tirol.it
+trentinosudtirol.it
+trentinosued-tirol.it
+trentinosuedtirol.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
+valleeaoste.it
+vao.it
+vda.it
+ven.it
+veneto.it
+// Provinces
ag.it
-alessandria.it
+agrigento.it
al.it
-ancona.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
-ao.it
-arezzo.it
+ap.it
+aq.it
+aquila.it
ar.it
+arezzo.it
ascoli-piceno.it
ascolipiceno.it
-ap.it
asti.it
at.it
-avellino.it
av.it
-bari.it
+avellino.it
ba.it
-andria-barletta-trani.it
-andriabarlettatrani.it
-trani-barletta-andria.it
-tranibarlettaandria.it
+balsan.it
+bari.it
barletta-trani-andria.it
barlettatraniandria.it
-andria-trani-barletta.it
-andriatranibarletta.it
-trani-andria-barletta.it
-traniandriabarletta.it
-bt.it
belluno.it
-bl.it
benevento.it
-bn.it
bergamo.it
bg.it
-biella.it
bi.it
-bologna.it
+biella.it
+bl.it
+bn.it
bo.it
+bologna.it
bolzano.it
bozen.it
-balsan.it
-alto-adige.it
-altoadige.it
-suedtirol.it
-bz.it
+br.it
brescia.it
-bs.it
brindisi.it
-br.it
-cagliari.it
+bs.it
+bt.it
+bz.it
ca.it
+cagliari.it
caltanissetta.it
-cl.it
+campidano-medio.it
+campidanomedio.it
campobasso.it
-cb.it
-carboniaiglesias.it
carbonia-iglesias.it
-iglesias-carbonia.it
-iglesiascarbonia.it
-ci.it
+carboniaiglesias.it
+carrara-massa.it
+carraramassa.it
caserta.it
-ce.it
catania.it
-ct.it
catanzaro.it
-cz.it
-chieti.it
+cb.it
+ce.it
+cesena-forli.it
+cesenaforli.it
ch.it
-como.it
+chieti.it
+ci.it
+cl.it
+cn.it
co.it
+como.it
cosenza.it
-cs.it
-cremona.it
cr.it
+cremona.it
crotone.it
-kr.it
+cs.it
+ct.it
cuneo.it
-cn.it
+cz.it
dell-ogliastra.it
dellogliastra.it
-ogliastra.it
-og.it
-enna.it
en.it
-ferrara.it
+enna.it
+fc.it
fe.it
fermo.it
-fm.it
+ferrara.it
+fg.it
+fi.it
firenze.it
florence.it
-fi.it
+fm.it
foggia.it
-fg.it
forli-cesena.it
forlicesena.it
-cesena-forli.it
-cesenaforli.it
-fc.it
-frosinone.it
fr.it
-genova.it
-genoa.it
+frosinone.it
ge.it
-gorizia.it
+genoa.it
+genova.it
go.it
-grosseto.it
+gorizia.it
gr.it
-imperia.it
+grosseto.it
+iglesias-carbonia.it
+iglesiascarbonia.it
im.it
-isernia.it
+imperia.it
is.it
-laquila.it
-aquila.it
-aq.it
+isernia.it
+kr.it
la-spezia.it
+laquila.it
laspezia.it
-sp.it
latina.it
-lt.it
-lecce.it
+lc.it
le.it
+lecce.it
lecco.it
-lc.it
-livorno.it
li.it
-lodi.it
+livorno.it
lo.it
-lucca.it
+lodi.it
+lt.it
lu.it
+lucca.it
macerata.it
-mc.it
mantova.it
-mn.it
massa-carrara.it
massacarrara.it
-carrara-massa.it
-carraramassa.it
-ms.it
matera.it
-mt.it
+mb.it
+mc.it
+me.it
medio-campidano.it
mediocampidano.it
-campidano-medio.it
-campidanomedio.it
-vs.it
messina.it
-me.it
-milano.it
-milan.it
mi.it
-modena.it
+milan.it
+milano.it
+mn.it
mo.it
-monza.it
+modena.it
monza-brianza.it
+monza-e-della-brianza.it
+monza.it
monzabrianza.it
monzaebrianza.it
monzaedellabrianza.it
-monza-e-della-brianza.it
-mb.it
-napoli.it
-naples.it
+ms.it
+mt.it
na.it
-novara.it
+naples.it
+napoli.it
no.it
-nuoro.it
+novara.it
nu.it
-oristano.it
+nuoro.it
+og.it
+ogliastra.it
+olbia-tempio.it
+olbiatempio.it
or.it
+oristano.it
+ot.it
+pa.it
padova.it
padua.it
-pd.it
palermo.it
-pa.it
parma.it
-pr.it
pavia.it
-pv.it
-perugia.it
-pg.it
-pescara.it
+pc.it
+pd.it
pe.it
+perugia.it
pesaro-urbino.it
pesarourbino.it
-urbino-pesaro.it
-urbinopesaro.it
-pu.it
+pescara.it
+pg.it
+pi.it
piacenza.it
-pc.it
pisa.it
-pi.it
pistoia.it
-pt.it
-pordenone.it
pn.it
+po.it
+pordenone.it
potenza.it
-pz.it
+pr.it
prato.it
-po.it
+pt.it
+pu.it
+pv.it
+pz.it
+ra.it
ragusa.it
-rg.it
ravenna.it
-ra.it
-reggio-calabria.it
-reggiocalabria.it
rc.it
+re.it
+reggio-calabria.it
reggio-emilia.it
+reggiocalabria.it
reggioemilia.it
-re.it
-rieti.it
+rg.it
ri.it
+rieti.it
rimini.it
+rm.it
rn.it
+ro.it
roma.it
rome.it
-rm.it
rovigo.it
-ro.it
-salerno.it
sa.it
+salerno.it
sassari.it
-ss.it
savona.it
-sv.it
-siena.it
si.it
+siena.it
siracusa.it
-sr.it
-sondrio.it
so.it
-taranto.it
+sondrio.it
+sp.it
+sr.it
+ss.it
+suedtirol.it
+sv.it
ta.it
+taranto.it
+te.it
tempio-olbia.it
tempioolbia.it
-olbia-tempio.it
-olbiatempio.it
-ot.it
teramo.it
-te.it
terni.it
-tr.it
-torino.it
-turin.it
+tn.it
to.it
-trapani.it
+torino.it
tp.it
-trento.it
+tr.it
+trani-andria-barletta.it
+trani-barletta-andria.it
+traniandriabarletta.it
+tranibarlettaandria.it
+trapani.it
trentino.it
-tn.it
+trento.it
treviso.it
-tv.it
trieste.it
ts.it
-udine.it
+turin.it
+tv.it
ud.it
-varese.it
+udine.it
+urbino-pesaro.it
+urbinopesaro.it
va.it
+varese.it
+vb.it
+vc.it
+ve.it
venezia.it
venice.it
-ve.it
verbania.it
-vb.it
vercelli.it
-vc.it
verona.it
-vr.it
+vi.it
vibo-valentia.it
vibovalentia.it
-vv.it
vicenza.it
-vi.it
viterbo.it
+vr.it
+vs.it
vt.it
+vv.it
-// je : http://www.channelisles.net/applic/avextn.shtml
+// je : http://www.channelisles.net/register-domains/
+// Confirmed by registry <nigel@channelisles.net> 2013-11-28
je
co.je
-org.je
net.je
-sch.je
-gov.je
+org.je
// jm : http://www.com.jm/register.html
*.jm
@@ -1511,10 +1598,9 @@ jobs
// jp : http://en.wikipedia.org/wiki/.jp
// http://jprs.co.jp/en/jpdomain.html
-// Submitted by registry <yone@jprs.co.jp> 2008-06-11
-// Updated by registry <yone@jprs.co.jp> 2008-12-04
+// Submitted by registry <info@jprs.jp> 2014-10-30
jp
-// jp organizational type names
+// jp organizational type names
ac.jp
ad.jp
co.jp
@@ -1524,125 +1610,1795 @@ gr.jp
lg.jp
ne.jp
or.jp
+// jp prefecture type names
+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
// jp geographic type names
// http://jprs.jp/doc/rule/saisoku-1.html
-*.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
*.kawasaki.jp
*.kitakyushu.jp
*.kobe.jp
-*.kochi.jp
-*.kumamoto.jp
-*.kyoto.jp
-*.mie.jp
-*.miyagi.jp
-*.miyazaki.jp
-*.nagano.jp
-*.nagasaki.jp
*.nagoya.jp
-*.nara.jp
-*.niigata.jp
-*.oita.jp
-*.okayama.jp
-*.okinawa.jp
-*.osaka.jp
-*.saga.jp
-*.saitama.jp
*.sapporo.jp
*.sendai.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
*.yokohama.jp
-!metro.tokyo.jp
-!pref.aichi.jp
-!pref.akita.jp
-!pref.aomori.jp
-!pref.chiba.jp
-!pref.ehime.jp
-!pref.fukui.jp
-!pref.fukuoka.jp
-!pref.fukushima.jp
-!pref.gifu.jp
-!pref.gunma.jp
-!pref.hiroshima.jp
-!pref.hokkaido.jp
-!pref.hyogo.jp
-!pref.ibaraki.jp
-!pref.ishikawa.jp
-!pref.iwate.jp
-!pref.kagawa.jp
-!pref.kagoshima.jp
-!pref.kanagawa.jp
-!pref.kochi.jp
-!pref.kumamoto.jp
-!pref.kyoto.jp
-!pref.mie.jp
-!pref.miyagi.jp
-!pref.miyazaki.jp
-!pref.nagano.jp
-!pref.nagasaki.jp
-!pref.nara.jp
-!pref.niigata.jp
-!pref.oita.jp
-!pref.okayama.jp
-!pref.okinawa.jp
-!pref.osaka.jp
-!pref.saga.jp
-!pref.saitama.jp
-!pref.shiga.jp
-!pref.shimane.jp
-!pref.shizuoka.jp
-!pref.tochigi.jp
-!pref.tokushima.jp
-!pref.tottori.jp
-!pref.toyama.jp
-!pref.wakayama.jp
-!pref.yamagata.jp
-!pref.yamaguchi.jp
-!pref.yamanashi.jp
-!city.chiba.jp
-!city.fukuoka.jp
-!city.hiroshima.jp
!city.kawasaki.jp
!city.kitakyushu.jp
!city.kobe.jp
-!city.kyoto.jp
!city.nagoya.jp
-!city.niigata.jp
-!city.okayama.jp
-!city.osaka.jp
-!city.saitama.jp
!city.sapporo.jp
!city.sendai.jp
-!city.shizuoka.jp
!city.yokohama.jp
+// 4th level registration
+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
+hitoyoshi.kumamoto.jp
+kamiamakusa.kumamoto.jp
+kashima.kumamoto.jp
+kikuchi.kumamoto.jp
+kosa.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
+kesennuma.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 : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145
*.ke
@@ -1701,6 +3457,7 @@ edu.kn
gov.kn
// kp : http://www.kcce.kp/en_index.php
+kp
com.kp
edu.kp
gov.kp
@@ -1778,6 +3535,7 @@ org.la
// lb : http://en.wikipedia.org/wiki/.lb
// Submitted by registry <randy@psg.com> 2008-06-17
+lb
com.lb
edu.lb
gov.lb
@@ -1816,6 +3574,7 @@ hotel.lk
// lr : http://psg.com/dns/lr/lr.txt
// Submitted by registry <randy@psg.com> 2008-06-17
+lr
com.lr
edu.lr
gov.lr
@@ -1958,11 +3717,21 @@ mq
mr
gov.mr
-// ms : http://en.wikipedia.org/wiki/.ms
+// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf
ms
-
-// mt : https://www.nic.org.mt/dotmt/
-*.mt
+com.ms
+edu.ms
+gov.ms
+net.ms
+org.ms
+
+// mt : https://www.nic.org.mt/go/policy
+// Submitted by registry <help@nic.org.mt> 2013-11-19
+mt
+com.mt
+edu.mt
+net.mt
+org.mt
// mu : http://en.wikipedia.org/wiki/.mu
mu
@@ -2579,6 +4348,7 @@ name.my
// mz : http://www.gobin.info/domainname/mz-template.doc
*.mz
+!teledata.mz
// na : http://www.na-nic.com.na/
// http://www.info.na/domain/
@@ -2628,13 +4398,16 @@ other.nf
store.nf
// ng : http://psg.com/dns/ng/
-// Submitted by registry <randy@psg.com> 2008-06-17
-ac.ng
+ng
com.ng
edu.ng
-gov.ng
+name.ng
net.ng
org.ng
+sch.ng
+gov.ng
+mil.ng
+mobi.ng
// ni : http://www.nic.ni/dominios.htm
*.ni
@@ -2650,7 +4423,7 @@ bv.nl
// no : http://www.norid.no/regelverk/index.en.html
// The Norwegian registry has declined to notify us of updates. The web pages
// referenced below are the official source of the data. There is also an
-// announce mailing list:
+// announce mailing list:
// https://postlister.uninett.no/sympa/info/norid-diskusjon
no
// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html
@@ -3432,20 +5205,36 @@ com.nr
nu
// nz : http://en.wikipedia.org/wiki/.nz
-*.nz
+// Confirmed by registry <jay@nzrs.net.nz> 2014-05-19
+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 : http://en.wikipedia.org/wiki/.om
-*.om
-!mediaphone.om
-!nawrastelecom.om
-!nawras.om
-!omanmobile.om
-!omanpost.om
-!omantel.om
-!rakpetroleum.om
-!siemens.om
-!songfest.om
-!statecouncil.om
+om
+co.om
+com.om
+edu.om
+gov.om
+med.om
+museum.om
+net.om
+org.om
+pro.om
// org : http://en.wikipedia.org/wiki/.org
org
@@ -3514,27 +5303,30 @@ gop.pk
gos.pk
info.pk
-// pl : http://www.dns.pl/english/
+// pl http://www.dns.pl/english/index.html
+// confirmed on 26.09.2014 from Bogna Tchórzewska <partner@dns.pl>
pl
-// NASK functional domains (nask.pl / dns.pl) : http://www.dns.pl/english/dns-funk.html
+com.pl
+net.pl
+org.pl
+info.pl
+waw.pl
+gov.pl
+// pl functional domains (http://www.dns.pl/english/index.html)
aid.pl
agro.pl
atm.pl
auto.pl
biz.pl
-com.pl
edu.pl
gmina.pl
gsm.pl
-info.pl
mail.pl
miasta.pl
media.pl
mil.pl
-net.pl
nieruchomosci.pl
nom.pl
-org.pl
pc.pl
powiat.pl
priv.pl
@@ -3550,12 +5342,7 @@ tm.pl
tourism.pl
travel.pl
turystyka.pl
-// ICM functional domains (icm.edu.pl)
-6bone.pl
-art.pl
-mbone.pl
// Government domains (administred by ippt.gov.pl)
-gov.pl
uw.gov.pl
um.gov.pl
ug.gov.pl
@@ -3565,11 +5352,7 @@ so.gov.pl
sr.gov.pl
po.gov.pl
pa.gov.pl
-// other functional domains
-ngo.pl
-irc.pl
-usenet.pl
-// NASK geographical domains : http://www.dns.pl/english/dns-regiony.html
+// pl regional domains (http://www.dns.pl/english/index.html)
augustow.pl
babia-gora.pl
bedzin.pl
@@ -3655,7 +5438,6 @@ rybnik.pl
rzeszow.pl
sanok.pl
sejny.pl
-siedlce.pl
slask.pl
slupsk.pl
sosnowiec.pl
@@ -3677,7 +5459,6 @@ ustka.pl
walbrzych.pl
warmia.pl
warszawa.pl
-waw.pl
wegrow.pl
wielun.pl
wlocl.pl
@@ -3690,18 +5471,6 @@ zagan.pl
zarow.pl
zgora.pl
zgorzelec.pl
-// TASK geographical domains (www.task.gda.pl/uslugi/dns)
-gda.pl
-gdansk.pl
-gdynia.pl
-med.pl
-sopot.pl
-// other geographical domains
-gliwice.pl
-krakow.pl
-poznan.pl
-wroc.pl
-zakopane.pl
// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
pm
@@ -3714,6 +5483,9 @@ org.pn
edu.pn
net.pn
+// post : http://en.wikipedia.org/wiki/.post
+post
+
// pr : http://www.nic.pr/index.asp?f=1
pr
com.pr
@@ -3772,8 +5544,16 @@ ed.pw
go.pw
belau.pw
-// py : http://www.nic.py/faq_a.html#faq_b
-*.py
+// py : http://www.nic.py/pautas.html#seccion_9
+// Confirmed by registry 2012-10-03
+py
+com.py
+coop.py
+edu.py
+gov.py
+mil.py
+net.py
+org.py
// qa : http://domains.qa/en/
qa
@@ -3875,7 +5655,7 @@ mari.ru
mari-el.ru
marine.ru
mordovia.ru
-mosreg.ru
+// mosreg.ru Bug 1090800 - removed at request of Aleksey Konstantinov <konstantinovav@mosreg.ru>
msk.ru
murmansk.ru
nalchik.ru
@@ -3889,7 +5669,6 @@ oryol.ru
palana.ru
penza.ru
perm.ru
-pskov.ru
ptz.ru
rnd.ru
ryazan.ru
@@ -4004,11 +5783,12 @@ net.sd
org.sd
edu.sd
med.sd
+tv.sd
gov.sd
info.sd
// se : http://en.wikipedia.org/wiki/.se
-// Submitted by registry <Patrik.Wallstrom@iis.se> 2008-06-24
+// Submitted by registry <patrik.wallstrom@iis.se> 2014-03-18
se
a.se
ac.se
@@ -4042,7 +5822,6 @@ pp.se
press.se
r.se
s.se
-sshn.se
t.se
tm.se
u.se
@@ -4051,7 +5830,7 @@ x.se
y.se
z.se
-// sg : http://www.nic.net.sg/sub_policies_agreement/2ld.html
+// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines
sg
com.sg
net.sg
@@ -4060,15 +5839,20 @@ gov.sg
edu.sg
per.sg
-// sh : http://www.nic.sh/rules.html
-// list of 2nd level domains ?
+// sh : http://www.nic.sh/registrar.html
sh
+com.sh
+net.sh
+gov.sh
+org.sh
+mil.sh
// si : http://en.wikipedia.org/wiki/.si
si
// sj : No registrations at this time.
// Submitted by registry <jarle@uninett.no> 2008-06-16
+sj
// sk : http://en.wikipedia.org/wiki/.sk
// list of 2nd level domains ?
@@ -4122,9 +5906,51 @@ store.st
// su : http://en.wikipedia.org/wiki/.su
su
-
-// sv : http://www.svnet.org.sv/svpolicy.html
-*.sv
+adygeya.su
+arkhangelsk.su
+balashov.su
+bashkiria.su
+bryansk.su
+dagestan.su
+grozny.su
+ivanovo.su
+kalmykia.su
+kaluga.su
+karelia.su
+khakassia.su
+krasnodar.su
+kurgan.su
+lenug.su
+mordovia.su
+msk.su
+murmansk.su
+nalchik.su
+nov.su
+obninsk.su
+penza.su
+pokrovsk.su
+sochi.su
+spb.su
+togliatti.su
+troitsk.su
+tula.su
+tuva.su
+vladikavkaz.su
+vladimir.su
+vologda.su
+
+// sv : http://www.svnet.org.sv/niveldos.pdf
+sv
+com.sv
+edu.sv
+gob.sv
+org.sv
+red.sv
+
+// sx : http://en.wikipedia.org/wiki/.sx
+// Confirmed by registry <jcvignes@openregistry.com> 2012-05-31
+sx
+gov.sx
// sy : http://en.wikipedia.org/wiki/.sy
// see also: http://www.gobin.info/domainname/sy.doc
@@ -4157,8 +5983,7 @@ tel
tf
// tg : http://en.wikipedia.org/wiki/.tg
-// http://www.nic.tg/nictg/index.php implies no reserved 2nd-level domains,
-// although this contradicts wikipedia.
+// http://www.nic.tg/
tg
// th : http://en.wikipedia.org/wiki/.th
@@ -4172,7 +5997,7 @@ mi.th
net.th
or.th
-// tj : http://www.nic.tj/policy.htm
+// tj : http://www.nic.tj/policy.html
tj
ac.tj
biz.tj
@@ -4197,9 +6022,16 @@ tk
tl
gov.tl
-// tm : http://www.nic.tm/rules.html
-// list of 2nd level tlds ?
+// tm : http://www.nic.tm/local.html
tm
+com.tm
+co.tm
+org.tm
+net.tm
+nom.tm
+gov.tm
+mil.tm
+edu.tm
// tn : http://en.wikipedia.org/wiki/.tn
// http://whois.ati.tn/
@@ -4235,11 +6067,39 @@ org.to
edu.to
mil.to
-// tr : http://en.wikipedia.org/wiki/.tr
-*.tr
-!nic.tr
-// Used by government in the TRNC
-// http://en.wikipedia.org/wiki/.nc.tr
+// tp : No registrations at this time.
+// Submitted by Ryan Sleevi <ryan.sleevi@gmail.com> 2014-01-03
+tp
+
+// subTLDs: https://www.nic.tr/forms/eng/policies.pdf
+// and: https://www.nic.tr/forms/politikalar.pdf
+// Submitted by <mehmetgurevin@gmail.com> 2014-07-19
+tr
+com.tr
+info.tr
+biz.tr
+net.tr
+org.tr
+web.tr
+gen.tr
+tv.tr
+av.tr
+dr.tr
+bbs.tr
+name.tr
+tel.tr
+gov.tr
+bel.tr
+pol.tr
+mil.tr
+k12.tr
+edu.tr
+kep.tr
+
+// Used by Northern Cyprus
+nc.tr
+
+// Used by government agencies of Northern Cyprus
gov.nc.tr
// travel : http://en.wikipedia.org/wiki/.travel
@@ -4286,101 +6146,134 @@ club.tw
組織.tw
商業.tw
-// tz : http://en.wikipedia.org/wiki/.tz
-// Submitted by registry <randy@psg.com> 2008-06-17
-// Updated from http://www.tznic.or.tz/index.php/domains.html 2010-10-25
+// tz : http://www.tznic.or.tz/index.php/domains
+// Confirmed by registry <manager@tznic.or.tz> 2013-01-22
+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 : http://www.nic.net.ua/
+// ua : https://hostmaster.ua/policy/?ua
+// Submitted by registry <dk@cctld.ua> 2012-04-27
ua
+// ua 2LD
com.ua
edu.ua
gov.ua
in.ua
net.ua
org.ua
-// ua geo-names
+// ua geographic names
+// https://hostmaster.ua/2ld/
cherkassy.ua
+cherkasy.ua
chernigov.ua
+chernihiv.ua
+chernivtsi.ua
chernovtsy.ua
ck.ua
cn.ua
+cr.ua
crimea.ua
cv.ua
dn.ua
dnepropetrovsk.ua
+dnipropetrovsk.ua
+dominic.ua
donetsk.ua
dp.ua
if.ua
ivano-frankivsk.ua
kh.ua
+kharkiv.ua
kharkov.ua
kherson.ua
khmelnitskiy.ua
+khmelnytskyi.ua
kiev.ua
kirovograd.ua
km.ua
kr.ua
+krym.ua
ks.ua
kv.ua
+kyiv.ua
lg.ua
+lt.ua
lugansk.ua
lutsk.ua
+lv.ua
lviv.ua
mk.ua
+mykolaiv.ua
nikolaev.ua
od.ua
+odesa.ua
odessa.ua
pl.ua
poltava.ua
+rivne.ua
rovno.ua
rv.ua
+sb.ua
sebastopol.ua
+sevastopol.ua
+sm.ua
sumy.ua
te.ua
ternopil.ua
+uz.ua
uzhgorod.ua
vinnica.ua
+vinnytsia.ua
vn.ua
+volyn.ua
+yalta.ua
zaporizhzhe.ua
-zp.ua
+zaporizhzhia.ua
zhitomir.ua
+zhytomyr.ua
+zp.ua
zt.ua
// Private registries in .ua
co.ua
pp.ua
-// ug : http://www.registry.co.ug/
+// ug : https://www.registry.co.ug/
ug
co.ug
+or.ug
ac.ug
sc.ug
go.ug
ne.ug
-or.ug
+com.ug
+org.ug
// uk : http://en.wikipedia.org/wiki/.uk
-*.uk
+// Submitted by registry <Michael.Daly@nominet.org.uk>
+uk
+ac.uk
+co.uk
+gov.uk
+ltd.uk
+me.uk
+net.uk
+nhs.uk
+org.uk
+plc.uk
+police.uk
*.sch.uk
-!bl.uk
-!british-library.uk
-!icnet.uk
-!jet.uk
-!mod.uk
-!nel.uk
-!nhs.uk
-!nic.uk
-!nls.uk
-!national-library-scotland.uk
-!parliament.uk
-!police.uk
// us : http://en.wikipedia.org/wiki/.us
us
@@ -4464,7 +6357,7 @@ k12.de.us
k12.fl.us
k12.ga.us
k12.gu.us
-// k12.hi.us Hawaii has a state-wide DOE login: bug 614565
+// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login
k12.ia.us
k12.id.us
k12.il.us
@@ -4481,7 +6374,7 @@ k12.mo.us
k12.ms.us
k12.mt.us
k12.nc.us
-k12.nd.us
+// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov>
k12.ne.us
k12.nh.us
k12.nj.us
@@ -4495,7 +6388,7 @@ k12.pa.us
k12.pr.us
k12.ri.us
k12.sc.us
-k12.sd.us
+// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us>
k12.tn.us
k12.tx.us
k12.ut.us
@@ -4504,9 +6397,8 @@ k12.vt.us
k12.va.us
k12.wa.us
k12.wi.us
-k12.wv.us
+// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu>
k12.wy.us
-
cc.ak.us
cc.al.us
cc.ar.us
@@ -4562,7 +6454,6 @@ cc.wa.us
cc.wi.us
cc.wv.us
cc.wy.us
-
lib.ak.us
lib.al.us
lib.ar.us
@@ -4616,25 +6507,31 @@ lib.vt.us
lib.va.us
lib.wa.us
lib.wi.us
-lib.wv.us
+// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us>
lib.wy.us
-
-// k12.ma.us contains school districts in Massachusetts. The 4LDs are
+// k12.ma.us contains school districts in Massachusetts. The 4LDs are
// managed indepedently except for private (PVT), charter (CHTR) and
-// parochial (PAROCH) schools. Those are delegated dorectly to the
+// parochial (PAROCH) schools. Those are delegated dorectly to the
// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net>
pvt.k12.ma.us
chtr.k12.ma.us
paroch.k12.ma.us
-// uy : http://www.antel.com.uy/
-*.uy
+// uy : http://www.nic.org.uy/
+uy
+com.uy
+edu.uy
+gub.uy
+mil.uy
+net.uy
+org.uy
-// uz : http://www.reg.uz/registerr.html
-// are there other 2nd level tlds ?
+// uz : http://www.reg.uz/
uz
-com.uz
co.uz
+com.uz
+net.uz
+org.uz
// va : http://en.wikipedia.org/wiki/.va
va
@@ -4649,8 +6546,27 @@ gov.vc
mil.vc
edu.vc
-// ve : http://registro.nic.ve/nicve/registro/index.html
-*.ve
+// ve : https://registro.nic.ve/
+// Confirmed by registry 2012-10-04
+// Updated 2014-05-20 - Bug 940478
+ve
+arts.ve
+co.ve
+com.ve
+e12.ve
+edu.ve
+firm.ve
+gob.ve
+gov.ve
+info.ve
+int.ve
+mil.ve
+net.ve
+org.ve
+rec.ve
+store.ve
+tec.ve
+web.ve
// vg : http://en.wikipedia.org/wiki/.vg
vg
@@ -4682,8 +6598,12 @@ pro.vn
health.vn
// vu : http://en.wikipedia.org/wiki/.vu
-// list of 2nd level tlds ?
+// http://www.vunic.vu/
vu
+com.vu
+edu.vu
+net.vu
+org.vu
// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
wf
@@ -4708,78 +6628,81 @@ yt
// <URL>
// xn--mgbaam7a8h ("Emerat" Arabic) : AE
-//http://nic.ae/english/arabicdomain/rules.jsp
+// http://nic.ae/english/arabicdomain/rules.jsp
امارات
-// xn--54b7fta0cc ("Bangla" Bangla) : BD
+// xn--54b7fta0cc ("Bangla" Bangla) : BD
বাংলা
-// xn--fiqs8s ("China" Chinese-Han-Simplified <.Zhonggou>) : CN
+// xn--fiqs8s ("China" Chinese-Han-Simplified <.Zhongguo>) : CN
// CNNIC
// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
中国
-// xn--fiqz9s ("China" Chinese-Han-Traditional <.Zhonggou>) : CN
+// xn--fiqz9s ("China" Chinese-Han-Traditional <.Zhongguo>) : CN
// CNNIC
// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
中國
-// xn--lgbbat1ad8j ("Algeria / Al Jazair" Arabic) : DZ
+// xn--lgbbat1ad8j ("Algeria / Al Jazair" Arabic) : DZ
الجزائر
// xn--wgbh1c ("Egypt" Arabic .masr) : EG
// http://www.dotmasr.eg/
مصر
-// xn--node ("ge" Georgian (Mkhedruli)) : GE
+// xn--node ("ge" Georgian (Mkhedruli)) : GE
გე
// xn--j6w193g ("Hong Kong" Chinese-Han) : HK
// https://www2.hkirc.hk/register/rules.jsp
香港
-// xn--h2brj9c ("Bharat" Devanagari) : IN
+// xn--h2brj9c ("Bharat" Devanagari) : IN
// India
भारत
-// xn--mgbbh1a71e ("Bharat" Arabic) : IN
+// xn--mgbbh1a71e ("Bharat" Arabic) : IN
// India
بھارت
-// xn--fpcrj9c3d ("Bharat" Telugu) : IN
+// xn--fpcrj9c3d ("Bharat" Telugu) : IN
// India
భారత్
-// xn--gecrj9c ("Bharat" Gujarati) : IN
+// xn--gecrj9c ("Bharat" Gujarati) : IN
// India
ભારત
-// xn--s9brj9c ("Bharat" Gurmukhi) : IN
+// xn--s9brj9c ("Bharat" Gurmukhi) : IN
// India
ਭਾਰਤ
-// xn--45brj9c ("Bharat" Bengali) : IN
+// xn--45brj9c ("Bharat" Bengali) : IN
// India
ভারত
-// xn--xkc2dl3a5ee0h ("India" Tamil) : IN
+// xn--xkc2dl3a5ee0h ("India" Tamil) : IN
// India
இந்தியா
-// xn--mgba3a4f16a ("Iran" Persian) : IR
+// xn--mgba3a4f16a ("Iran" Persian) : IR
ایران
-// xn--mgba3a4fra ("Iran" Arabic) : IR
+// xn--mgba3a4fra ("Iran" Arabic) : IR
ايران
-//xn--mgbayh7gpa ("al-Ordon" Arabic) JO
-//National Information Technology Center (NITC)
-//Royal Scientific Society, Al-Jubeiha
+// xn--mgbayh7gpa ("al-Ordon" Arabic) : JO
+// National Information Technology Center (NITC)
+// Royal Scientific Society, Al-Jubeiha
الاردن
-// xn--3e0b707e ("Republic of Korea" Hangul) : KR
+// xn--3e0b707e ("Republic of Korea" Hangul) : KR
한국
+// xn--80ao21a ("Kaz" Kazakh) : KZ
+қаз
+
// xn--fzc2c9e2c ("Lanka" Sinhalese-Sinhala) : LK
// http://nic.lk
ලංකා
@@ -4788,10 +6711,16 @@ yt
// http://nic.lk
இலங்கை
-// xn--mgbc0a9azcg ("Morocco / al-Maghrib" Arabic) : MA
+// xn--mgbc0a9azcg ("Morocco / al-Maghrib" Arabic) : MA
المغرب
-// xn--mgb9awbf ("Oman" Arabic) : OM
+// xn--l1acc ("mon" Mongolian) : MN
+мон
+
+// xn--mgbx4cd0ab ("Malaysia" Malay) : MY
+مليسيا
+
+// xn--mgb9awbf ("Oman" Arabic) : OM
عمان
// xn--ygbi2ammx ("Falasteen" Arabic) : PS
@@ -4799,8 +6728,15 @@ yt
// http://www.pnina.ps
فلسطين
-// xn--90a3ac ("srb" Cyrillic) : RS
+// xn--90a3ac ("srb" Cyrillic) : RS
+// http://www.rnids.rs/en/the-.срб-domain
срб
+пр.срб
+орг.срб
+обр.срб
+од.срб
+упр.срб
+ак.срб
// xn--p1ai ("rf" Russian-Cyrillic) : RU
// http://www.cctld.ru/en/docs/rulesrf.php
@@ -4814,19 +6750,19 @@ yt
// http://www.nic.net.sa/
السعودية
-// xn--mgberp4a5d4a87g ("AlSaudiah" Arabic) variant : SA
+// xn--mgberp4a5d4a87g ("AlSaudiah" Arabic) variant : SA
السعودیة
-// xn--mgbqly7c0a67fbc ("AlSaudiah" Arabic) variant : SA
+// xn--mgbqly7c0a67fbc ("AlSaudiah" Arabic) variant : SA
السعودیۃ
-// xn--mgbqly7cvafr ("AlSaudiah" Arabic) variant : SA
+// xn--mgbqly7cvafr ("AlSaudiah" Arabic) variant : SA
السعوديه
-// xn--ogbpf8fl ("Syria" Arabic) : SY
+// xn--ogbpf8fl ("Syria" Arabic) : SY
سورية
-// xn--mgbtf8fl ("Syria" Arabic) variant : SY
+// xn--mgbtf8fl ("Syria" Arabic) variant : SY
سوريا
// xn--yfro4i67o Singapore ("Singapore" Chinese-Han) : SG
@@ -4851,13 +6787,13 @@ yt
// http://www.twnic.net/english/dn/dn_07a.htm
台湾
-// xn--nnx388a ("Taiwan") variant : TW
+// xn--nnx388a ("Taiwan") variant : TW
臺灣
-// xn--j1amh ("ukr" Cyrillic) : UA
+// xn--j1amh ("ukr" Cyrillic) : UA
укр
-// xn--mgb2ddes ("AlYemen" Arabic) : YE
+// xn--mgb2ddes ("AlYemen" Arabic) : YE
اليمن
// xxx : http://icmregistry.com
@@ -4875,75 +6811,2821 @@ xxx
// zw : http://en.wikipedia.org/wiki/.zw
*.zw
-// ===END ICANN DOMAINS===
-// ===BEGIN PRIVATE DOMAINS===
-// info.at : http://www.info.at/
-biz.at
-info.at
+// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2015-04-07T06:02:08Z
-// priv.at : http://www.nic.priv.at/
-// Submitted by registry <lendl@nic.at> 2008-06-09
-priv.at
+// aaa : 2015-02-26 American Automobile Association, Inc.
+aaa
-// co.ca : http://registry.co.ca
-co.ca
+// abb : 2014-10-24 ABB Ltd
+abb
+
+// abbott : 2014-07-24 Abbott Laboratories, Inc.
+abbott
+
+// abogado : 2014-04-24 Top Level Domain Holdings Limited
+abogado
+
+// academy : 2013-11-07 Half Oaks, LLC
+academy
+
+// accenture : 2014-08-15 Accenture plc
+accenture
+
+// accountant : 2014-11-20 dot Accountant Limited
+accountant
+
+// accountants : 2014-03-20 Knob Town, LLC
+accountants
+
+// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG
+aco
+
+// active : 2014-05-01 The Active Network, Inc
+active
+
+// actor : 2013-12-12 United TLD Holdco Ltd.
+actor
+
+// ads : 2014-12-04 Charleston Road Registry Inc.
+ads
+
+// adult : 2014-10-16 ICM Registry AD LLC
+adult
+
+// aeg : 2015-03-19 Aktiebolaget Electrolux
+aeg
+
+// afl : 2014-10-02 Australian Football League
+afl
+
+// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa
+africa
+
+// africamagic : 2015-03-05 Electronic Media Network (Pty) Ltd
+africamagic
+
+// agency : 2013-11-14 Steel Falls, LLC
+agency
+
+// aig : 2014-12-18 American International Group, Inc.
+aig
+
+// airforce : 2014-03-06 United TLD Holdco Ltd.
+airforce
+
+// airtel : 2014-10-24 Bharti Airtel Limited
+airtel
+
+// alibaba : 2015-01-15 Alibaba Group Holding Limited
+alibaba
+
+// alipay : 2015-01-15 Alibaba Group Holding Limited
+alipay
+
+// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
+allfinanz
+
+// alsace : 2014-07-02 REGION D ALSACE
+alsace
+
+// amsterdam : 2014-07-24 Gemeente Amsterdam
+amsterdam
+
+// analytics : 2014-12-18 Campus IP LLC
+analytics
+
+// android : 2014-08-07 Charleston Road Registry Inc.
+android
+
+// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+anquan
+
+// apartments : 2014-12-11 June Maple, LLC
+apartments
+
+// aquarelle : 2014-07-24 Aquarelle.com
+aquarelle
+
+// aramco : 2014-11-20 Aramco Services Company
+aramco
+
+// archi : 2014-02-06 STARTING DOT LIMITED
+archi
+
+// army : 2014-03-06 United TLD Holdco Ltd.
+army
+
+// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E.
+arte
+
+// associates : 2014-03-06 Baxter Hill, LLC
+associates
+
+// attorney : 2014-03-20
+attorney
+
+// auction : 2014-03-20
+auction
+
+// audio : 2014-03-20 Uniregistry, Corp.
+audio
+
+// author : 2014-12-18 Amazon EU S.à r.l.
+author
+
+// auto : 2014-11-13 Uniregistry, Corp.
+auto
+
+// autos : 2014-01-09 DERAutos, LLC
+autos
+
+// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca
+avianca
+
+// axa : 2013-12-19 AXA SA
+axa
+
+// azure : 2014-12-18 Microsoft Corporation
+azure
+
+// baidu : 2015-01-08 Baidu, Inc.
+baidu
+
+// band : 2014-06-12
+band
+
+// bank : 2014-09-25 fTLD Registry Services LLC
+bank
+
+// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
+bar
+
+// barcelona : 2014-07-24 Municipi de Barcelona
+barcelona
+
+// barclaycard : 2014-11-20 Barclays Bank PLC
+barclaycard
+
+// barclays : 2014-11-20 Barclays Bank PLC
+barclays
+
+// bargains : 2013-11-14 Half Hallow, LLC
+bargains
+
+// bauhaus : 2014-04-17 Werkhaus GmbH
+bauhaus
+
+// bayern : 2014-01-23 Bayern Connect GmbH
+bayern
+
+// bbc : 2014-12-18 British Broadcasting Corporation
+bbc
+
+// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A.
+bbva
+
+// bcg : 2015-04-02 The Boston Consulting Group, Inc.
+bcg
+
+// bcn : 2014-07-24 Municipi de Barcelona
+bcn
+
+// beer : 2014-01-09 Top Level Domain Holdings Limited
+beer
+
+// bentley : 2014-12-18 Bentley Motors Limited
+bentley
+
+// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG
+berlin
+
+// best : 2013-12-19 BestTLD Pty Ltd
+best
+
+// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited
+bharti
+
+// bible : 2014-06-19 American Bible Society
+bible
+
+// bid : 2013-12-19 dot Bid Limited
+bid
+
+// bike : 2013-08-27 Grand Hollow, LLC
+bike
+
+// bing : 2014-12-18 Microsoft Corporation
+bing
+
+// bingo : 2014-12-04 Sand Cedar, LLC
+bingo
+
+// bio : 2014-03-06 STARTING DOT LIMITED
+bio
+
+// black : 2014-01-16 Afilias Limited
+black
+
+// blackfriday : 2014-01-16 Uniregistry, Corp.
+blackfriday
+
+// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC
+bloomberg
+
+// blue : 2013-11-07 Afilias Limited
+blue
+
+// bms : 2014-10-30 Bristol-Myers Squibb Company
+bms
+
+// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft
+bmw
+
+// bnl : 2014-07-24 Banca Nazionale del Lavoro
+bnl
+
+// bnpparibas : 2014-05-29 BNP Paribas
+bnpparibas
+
+// boats : 2014-12-04 DERBoats, LLC
+boats
+
+// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
+bom
+
+// bond : 2014-06-05 Bond University Limited
+bond
+
+// boo : 2014-01-30 Charleston Road Registry Inc.
+boo
+
+// boots : 2015-01-08 THE BOOTS COMPANY PLC
+boots
+
+// bot : 2014-12-18 Amazon EU S.à r.l.
+bot
+
+// boutique : 2013-11-14 Over Galley, LLC
+boutique
+
+// bradesco : 2014-12-18 Banco Bradesco S.A.
+bradesco
+
+// bridgestone : 2014-12-18 Bridgestone Corporation
+bridgestone
+
+// broadway : 2014-12-22 Celebrate Broadway, Inc.
+broadway
+
+// broker : 2014-12-11 IG Group Holdings PLC
+broker
+
+// brother : 2015-01-29 Brother Industries, Ltd.
+brother
+
+// brussels : 2014-02-06 DNS.be vzw
+brussels
+
+// budapest : 2013-11-21 Top Level Domain Holdings Limited
+budapest
+
+// build : 2013-11-07 Plan Bee LLC
+build
+
+// builders : 2013-11-07 Atomic Madison, LLC
+builders
+
+// business : 2013-11-07 Spring Cross, LLC
+business
+
+// buy : 2014-12-18 Amazon EU S.à r.l.
+buy
+
+// buzz : 2013-10-02 DOTSTRATEGY CO.
+buzz
+
+// bzh : 2014-02-27 Association www.bzh
+bzh
+
+// cab : 2013-10-24 Half Sunset, LLC
+cab
+
+// cafe : 2015-02-11 Pioneer Canyon, LLC
+cafe
+
+// cal : 2014-07-24 Charleston Road Registry Inc.
+cal
+
+// call : 2014-12-18 Amazon EU S.à r.l.
+call
+
+// camera : 2013-08-27 Atomic Maple, LLC
+camera
+
+// camp : 2013-11-07 Delta Dynamite, LLC
+camp
+
+// cancerresearch : 2014-05-15 Australian Cancer Research Foundation
+cancerresearch
+
+// canon : 2014-09-12 Canon Inc.
+canon
+
+// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
+capetown
+
+// capital : 2014-03-06 Delta Mill, LLC
+capital
+
+// car : 2015-01-22 Charleston Road Registry Inc.
+car
+
+// caravan : 2013-12-12 Caravan International, Inc.
+caravan
+
+// cards : 2013-12-05 Foggy Hollow, LLC
+cards
+
+// care : 2014-03-06 Goose Cross
+care
+
+// career : 2013-10-09 dotCareer LLC
+career
+
+// careers : 2013-10-02 Wild Corner, LLC
+careers
+
+// cars : 2014-11-13 Uniregistry, Corp.
+cars
+
+// cartier : 2014-06-23 Richemont DNS Inc.
+cartier
+
+// casa : 2013-11-21 Top Level Domain Holdings Limited
+casa
+
+// cash : 2014-03-06 Delta Lake, LLC
+cash
+
+// casino : 2014-12-18 Binky Sky, LLC
+casino
+
+// catering : 2013-12-05 New Falls. LLC
+catering
+
+// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+cba
+
+// cbn : 2014-08-22 The Christian Broadcasting Network, Inc.
+cbn
+
+// center : 2013-11-07 Tin Mill, LLC
+center
+
+// ceo : 2013-11-07 CEOTLD Pty Ltd
+ceo
+
+// cern : 2014-06-05 European Organization for Nuclear Research (\
+cern
+
+// cfa : 2014-08-28 CFA Institute
+cfa
+
+// cfd : 2014-12-11 IG Group Holdings PLC
+cfd
+
+// channel : 2014-05-08 Charleston Road Registry Inc.
+channel
+
+// chat : 2014-12-04 Sand Fields, LLC
+chat
+
+// cheap : 2013-11-14 Sand Cover, LLC
+cheap
+
+// chloe : 2014-10-16 Richemont DNS Inc.
+chloe
+
+// christmas : 2013-11-21 Uniregistry, Corp.
+christmas
+
+// chrome : 2014-07-24 Charleston Road Registry Inc.
+chrome
+
+// church : 2014-02-06 Holly Fields, LLC
+church
+
+// cipriani : 2015-02-19 Hotel Cipriani Srl
+cipriani
+
+// circle : 2014-12-18 Amazon EU S.à r.l.
+circle
+
+// cisco : 2014-12-22 Cisco Technology, Inc.
+cisco
+
+// citic : 2014-01-09 CITIC Group Corporation
+citic
+
+// city : 2014-05-29 Snow Sky, LLC
+city
+
+// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc.
+cityeats
+
+// claims : 2014-03-20 Black Corner, LLC
+claims
+
+// cleaning : 2013-12-05 Fox Shadow, LLC
+cleaning
+
+// click : 2014-06-05 Uniregistry, Corp.
+click
+
+// clinic : 2014-03-20 Goose Park, LLC
+clinic
+
+// clothing : 2013-08-27 Steel Lake, LLC
+clothing
+
+// club : 2013-11-08 .CLUB DOMAINS, LLC
+club
+
+// coach : 2014-10-09 Koko Island, LLC
+coach
+
+// codes : 2013-10-31 Puff Willow, LLC
+codes
+
+// coffee : 2013-10-17 Trixy Cover, LLC
+coffee
+
+// college : 2014-01-16 XYZ.COM LLC
+college
+
+// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH
+cologne
+
+// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+commbank
+
+// community : 2013-12-05 Fox Orchard, LLC
+community
+
+// company : 2013-11-07 Silver Avenue, LLC
+company
+
+// computer : 2013-10-24 Pine Mill, LLC
+computer
+
+// comsec : 2015-01-08 VeriSign, Inc.
+comsec
+
+// condos : 2013-12-05 Pine House, LLC
+condos
+
+// construction : 2013-09-16 Fox Dynamite, LLC
+construction
+
+// consulting : 2013-12-05
+consulting
+
+// contact : 2015-01-08 Top Level Spectrum, Inc.
+contact
+
+// contractors : 2013-09-10 Magic Woods, LLC
+contractors
+
+// cooking : 2013-11-21 Top Level Domain Holdings Limited
+cooking
+
+// cool : 2013-11-14 Koko Lake, LLC
+cool
+
+// corsica : 2014-09-25 Collectivité Territoriale de Corse
+corsica
+
+// country : 2013-12-19 Top Level Domain Holdings Limited
+country
+
+// coupon : 2015-02-26 Amazon EU S.à r.l.
+coupon
+
+// coupons : 2015-03-26 Black Island, LLC
+coupons
+
+// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD
+courses
+
+// credit : 2014-03-20 Snow Shadow, LLC
+credit
+
+// creditcard : 2014-03-20 Binky Frostbite, LLC
+creditcard
+
+// creditunion : 2015-01-22 CUNA Performance Resources, LLC
+creditunion
+
+// cricket : 2014-10-09 dot Cricket Limited
+cricket
+
+// crown : 2014-10-24 Crown Equipment Corporation
+crown
+
+// crs : 2014-04-03 Federated Co-operatives Limited
+crs
+
+// cruises : 2013-12-05 Spring Way, LLC
+cruises
+
+// csc : 2014-09-25 Alliance-One Services, Inc.
+csc
+
+// cuisinella : 2014-04-03 SALM S.A.S.
+cuisinella
+
+// cymru : 2014-05-08 Nominet UK
+cymru
+
+// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd.
+cyou
+
+// dabur : 2014-02-06 Dabur India Limited
+dabur
+
+// dad : 2014-01-23 Charleston Road Registry Inc.
+dad
+
+// dance : 2013-10-24 United TLD Holdco Ltd.
+dance
+
+// date : 2014-11-20 dot Date Limited
+date
+
+// dating : 2013-12-05 Pine Fest, LLC
+dating
+
+// datsun : 2014-03-27 NISSAN MOTOR CO., LTD.
+datsun
+
+// day : 2014-01-30 Charleston Road Registry Inc.
+day
+
+// dclk : 2014-11-20 Charleston Road Registry Inc.
+dclk
+
+// dealer : 2014-12-22 Dealer Dot Com, Inc.
+dealer
+
+// deals : 2014-05-22 Sand Sunset, LLC
+deals
+
+// degree : 2014-03-06
+degree
+
+// delivery : 2014-09-11 Steel Station, LLC
+delivery
+
+// dell : 2014-10-24 Dell Inc.
+dell
+
+// delta : 2015-02-19 Delta Air Lines, Inc.
+delta
+
+// democrat : 2013-10-24 United TLD Holdco Ltd.
+democrat
+
+// dental : 2014-03-20 Tin Birch, LLC
+dental
+
+// dentist : 2014-03-20
+dentist
+
+// desi : 2013-11-14 Desi Networks LLC
+desi
+
+// design : 2014-11-07 Top Level Design, LLC
+design
+
+// dev : 2014-10-16 Charleston Road Registry Inc.
+dev
+
+// diamonds : 2013-09-22 John Edge, LLC
+diamonds
+
+// diet : 2014-06-26 Uniregistry, Corp.
+diet
+
+// digital : 2014-03-06 Dash Park, LLC
+digital
+
+// direct : 2014-04-10 Half Trail, LLC
+direct
+
+// directory : 2013-09-20 Extra Madison, LLC
+directory
+
+// discount : 2014-03-06 Holly Hill, LLC
+discount
+
+// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd.
+dnp
+
+// docs : 2014-10-16 Charleston Road Registry Inc.
+docs
+
+// dog : 2014-12-04 Koko Mill, LLC
+dog
+
+// doha : 2014-09-18 Communications Regulatory Authority (CRA)
+doha
+
+// domains : 2013-10-17 Sugar Cross, LLC
+domains
+
+// doosan : 2014-04-03 Doosan Corporation
+doosan
+
+// download : 2014-11-20 dot Support Limited
+download
+
+// drive : 2015-03-05 Charleston Road Registry Inc.
+drive
+
+// dstv : 2015-03-12 MultiChoice (Proprietary) Limited
+dstv
+
+// dubai : 2015-01-01 Dubai Smart Government Department
+dubai
+
+// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
+durban
+
+// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+dvag
+
+// earth : 2014-12-04 Interlink Co., Ltd.
+earth
+
+// eat : 2014-01-23 Charleston Road Registry Inc.
+eat
+
+// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V.
+edeka
+
+// education : 2013-11-07 Brice Way, LLC
+education
+
+// email : 2013-10-31 Spring Madison, LLC
+email
+
+// emerck : 2014-04-03 Merck KGaA
+emerck
+
+// energy : 2014-09-11 Binky Birch, LLC
+energy
+
+// engineer : 2014-03-06 United TLD Holdco Ltd.
+engineer
+
+// engineering : 2014-03-06 Romeo Canyon
+engineering
+
+// enterprises : 2013-09-20 Snow Oaks, LLC
+enterprises
+
+// epson : 2014-12-04 Seiko Epson Corporation
+epson
+
+// equipment : 2013-08-27 Corn Station, LLC
+equipment
+
+// erni : 2014-04-03 ERNI Group Holding AG
+erni
+
+// esq : 2014-05-08 Charleston Road Registry Inc.
+esq
+
+// estate : 2013-08-27 Trixy Park, LLC
+estate
+
+// eurovision : 2014-04-24 European Broadcasting Union (EBU)
+eurovision
+
+// eus : 2013-12-12 Puntueus Fundazioa
+eus
+
+// events : 2013-12-05 Pioneer Maple, LLC
+events
+
+// everbank : 2014-05-15 EverBank
+everbank
+
+// exchange : 2014-03-06 Spring Falls, LLC
+exchange
+
+// expert : 2013-11-21 Magic Pass, LLC
+expert
+
+// exposed : 2013-12-05 Victor Beach, LLC
+exposed
+
+// express : 2015-02-11 Sea Sunset, LLC
+express
+
+// fage : 2014-12-18 Fage International S.A.
+fage
+
+// fail : 2014-03-06 Atomic Pipe, LLC
+fail
+
+// fairwinds : 2014-11-13 FairWinds Partners, LLC
+fairwinds
+
+// faith : 2014-11-20 dot Faith Limited
+faith
+
+// family : 2015-04-02 Bitter Galley, LLC
+family
+
+// fan : 2014-03-06
+fan
+
+// fans : 2014-11-07 Asiamix Digital Limited
+fans
+
+// farm : 2013-11-07 Just Maple, LLC
+farm
+
+// fashion : 2014-07-03 Top Level Domain Holdings Limited
+fashion
+
+// fast : 2014-12-18 Amazon EU S.à r.l.
+fast
+
+// feedback : 2013-12-19 Top Level Spectrum, Inc.
+feedback
+
+// ferrero : 2014-12-18 Ferrero Trading Lux S.A.
+ferrero
+
+// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd
+film
+
+// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
+final
+
+// finance : 2014-03-20 Cotton Cypress, LLC
+finance
+
+// financial : 2014-03-06 Just Cover, LLC
+financial
+
+// firestone : 2014-12-18 Bridgestone Corporation
+firestone
+
+// firmdale : 2014-03-27 Firmdale Holdings Limited
+firmdale
+
+// fish : 2013-12-12 Fox Woods, LLC
+fish
+
+// fishing : 2013-11-21 Top Level Domain Holdings Limited
+fishing
+
+// fit : 2014-11-07 Top Level Domain Holdings Limited
+fit
+
+// fitness : 2014-03-06 Brice Orchard, LLC
+fitness
+
+// flickr : 2015-04-02 Yahoo! Domain Services Inc.
+flickr
+
+// flights : 2013-12-05 Fox Station, LLC
+flights
+
+// florist : 2013-11-07 Half Cypress, LLC
+florist
+
+// flowers : 2014-10-09 Uniregistry, Corp.
+flowers
+
+// flsmidth : 2014-07-24 FLSmidth A/S
+flsmidth
+
+// fly : 2014-05-08 Charleston Road Registry Inc.
+fly
+
+// foo : 2014-01-23 Charleston Road Registry Inc.
+foo
+
+// football : 2014-12-18 Foggy Farms, LLC
+football
+
+// ford : 2014-11-13 Ford Motor Company
+ford
+
+// forex : 2014-12-11 IG Group Holdings PLC
+forex
+
+// forsale : 2014-05-22
+forsale
+
+// forum : 2015-04-02 Fegistry, LLC
+forum
+
+// foundation : 2013-12-05 John Dale, LLC
+foundation
+
+// frl : 2014-05-15 FRLregistry B.V.
+frl
+
+// frogans : 2013-12-19 OP3FT
+frogans
+
+// frontier : 2015-02-05 Frontier Communications Corporation
+frontier
+
+// fund : 2014-03-20 John Castle, LLC
+fund
+
+// furniture : 2014-03-20 Lone Fields, LLC
+furniture
+
+// futbol : 2013-09-20
+futbol
+
+// fyi : 2015-04-02 Silver Tigers, LLC
+fyi
+
+// gal : 2013-11-07 Asociación puntoGAL
+gal
+
+// gallery : 2013-09-13 Sugar House, LLC
+gallery
+
+// gallup : 2015-02-19 Gallup, Inc.
+gallup
+
+// garden : 2014-06-26 Top Level Domain Holdings Limited
+garden
+
+// gbiz : 2014-07-17 Charleston Road Registry Inc.
+gbiz
+
+// gdn : 2014-07-31 Joint Stock Company \
+gdn
+
+// gea : 2014-12-04 GEA Group Aktiengesellschaft
+gea
+
+// gent : 2014-01-23 COMBELL GROUP NV/SA
+gent
+
+// genting : 2015-03-12 Resorts World Inc Pte. Ltd.
+genting
+
+// ggee : 2014-01-09 GMO Internet, Inc.
+ggee
+
+// gift : 2013-10-17 Uniregistry, Corp.
+gift
+
+// gifts : 2014-07-03 Goose Sky, LLC
+gifts
+
+// gives : 2014-03-06 United TLD Holdco Ltd.
+gives
+
+// giving : 2014-11-13 Giving Limited
+giving
+
+// glass : 2013-11-07 Black Cover, LLC
+glass
+
+// gle : 2014-07-24 Charleston Road Registry Inc.
+gle
+
+// global : 2014-04-17 Dot GLOBAL AS
+global
+
+// globo : 2013-12-19 Globo Comunicação e Participações S.A
+globo
+
+// gmail : 2014-05-01 Charleston Road Registry Inc.
+gmail
+
+// gmo : 2014-01-09 GMO Internet, Inc.
+gmo
+
+// gmx : 2014-04-24 1&1 Mail & Media GmbH
+gmx
+
+// gold : 2015-01-22 June Edge, LLC
+gold
+
+// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
+goldpoint
+
+// golf : 2014-12-18 Lone falls, LLC
+golf
+
+// goo : 2014-12-18 NTT Resonant Inc.
+goo
+
+// goog : 2014-11-20 Charleston Road Registry Inc.
+goog
+
+// google : 2014-07-24 Charleston Road Registry Inc.
+google
+
+// gop : 2014-01-16 Republican State Leadership Committee, Inc.
+gop
+
+// got : 2014-12-18 Amazon EU S.à r.l.
+got
+
+// gotv : 2015-03-12 MultiChoice (Proprietary) Limited
+gotv
+
+// graphics : 2013-09-13 Over Madison, LLC
+graphics
+
+// gratis : 2014-03-20 Pioneer Tigers, LLC
+gratis
+
+// green : 2014-05-08 Afilias Limited
+green
+
+// gripe : 2014-03-06 Corn Sunset, LLC
+gripe
+
+// group : 2014-08-15 Romeo Town, LLC
+group
+
+// gucci : 2014-11-13 Guccio Gucci S.p.a.
+gucci
+
+// guge : 2014-08-28 Charleston Road Registry Inc.
+guge
+
+// guide : 2013-09-13 Snow Moon, LLC
+guide
+
+// guitars : 2013-11-14 Uniregistry, Corp.
+guitars
+
+// guru : 2013-08-27 Pioneer Cypress, LLC
+guru
+
+// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH
+hamburg
+
+// hangout : 2014-11-13 Charleston Road Registry Inc.
+hangout
+
+// haus : 2013-12-05
+haus
+
+// hdfcbank : 2015-02-12 HDFC Bank Limited
+hdfcbank
+
+// health : 2015-02-11 DotHealth, LLC
+health
+
+// healthcare : 2014-06-12 Silver Glen, LLC
+healthcare
+
+// help : 2014-06-26 Uniregistry, Corp.
+help
+
+// helsinki : 2015-02-05 City of Helsinki
+helsinki
+
+// here : 2014-02-06 Charleston Road Registry Inc.
+here
+
+// hermes : 2014-07-10 HERMES INTERNATIONAL
+hermes
+
+// hiphop : 2014-03-06 Uniregistry, Corp.
+hiphop
+
+// hitachi : 2014-10-31 Hitachi, Ltd.
+hitachi
+
+// hiv : 2014-03-13 dotHIV gemeinnuetziger e.V.
+hiv
+
+// hockey : 2015-03-19 Half Willow, LLC
+hockey
+
+// holdings : 2013-08-27 John Madison, LLC
+holdings
+
+// holiday : 2013-11-07 Goose Woods, LLC
+holiday
+
+// homedepot : 2015-04-02 Homer TLC, Inc.
+homedepot
+
+// homes : 2014-01-09 DERHomes, LLC
+homes
+
+// honda : 2014-12-18 Honda Motor Co., Ltd.
+honda
+
+// horse : 2013-11-21 Top Level Domain Holdings Limited
+horse
+
+// host : 2014-04-17 DotHost Inc.
+host
+
+// hosting : 2014-05-29 Uniregistry, Corp.
+hosting
+
+// hoteles : 2015-03-05 Travel Reservations SRL
+hoteles
+
+// hotmail : 2014-12-18 Microsoft Corporation
+hotmail
+
+// house : 2013-11-07 Sugar Park, LLC
+house
+
+// how : 2014-01-23 Charleston Road Registry Inc.
+how
+
+// hsbc : 2014-10-24 HSBC Holdings PLC
+hsbc
+
+// htc : 2015-04-02 HTC corporation
+htc
+
+// ibm : 2014-07-31 International Business Machines Corporation
+ibm
+
+// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited
+icbc
+
+// ice : 2014-10-30 IntercontinentalExchange, Inc.
+ice
+
+// icu : 2015-01-08 One.com A/S
+icu
+
+// ifm : 2014-01-30 ifm electronic gmbh
+ifm
+
+// iinet : 2014-07-03 Connect West Pty. Ltd.
+iinet
+
+// immo : 2014-07-10 Auburn Bloom, LLC
+immo
+
+// immobilien : 2013-11-07 United TLD Holdco Ltd.
+immobilien
+
+// industries : 2013-12-05 Outer House, LLC
+industries
+
+// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD.
+infiniti
+
+// ing : 2014-01-23 Charleston Road Registry Inc.
+ing
+
+// ink : 2013-12-05 Top Level Design, LLC
+ink
+
+// institute : 2013-11-07 Outer Maple, LLC
+institute
+
+// insurance : 2015-02-19 fTLD Registry Services LLC
+insurance
+
+// insure : 2014-03-20 Pioneer Willow, LLC
+insure
+
+// international : 2013-11-07 Wild Way, LLC
+international
+
+// investments : 2014-03-20 Holly Glen, LLC
+investments
+
+// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A.
+ipiranga
+
+// irish : 2014-08-07 Dot-Irish LLC
+irish
+
+// iselect : 2015-02-11 iSelect Ltd
+iselect
+
+// ist : 2014-08-28 Istanbul Metropolitan Municipality
+ist
+
+// istanbul : 2014-08-28 Istanbul Metropolitan Municipality
+istanbul
+
+// itau : 2014-10-02 Itau Unibanco Holding S.A.
+itau
+
+// iwc : 2014-06-23 Richemont DNS Inc.
+iwc
+
+// jaguar : 2014-11-13 Jaguar Land Rover Ltd
+jaguar
+
+// java : 2014-06-19 Oracle Corporation
+java
+
+// jcb : 2014-11-20 JCB Co., Ltd.
+jcb
+
+// jetzt : 2014-01-09 New TLD Company AB
+jetzt
+
+// jewelry : 2015-03-05 Wild Bloom, LLC
+jewelry
+
+// jio : 2015-04-02 Affinity Names, Inc.
+jio
+
+// jlc : 2014-12-04 Richemont DNS Inc.
+jlc
+
+// jll : 2015-04-02 Jones Lang LaSalle Incorporated
+jll
+
+// jmp : 2015-03-26 Matrix IP LLC
+jmp
+
+// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
+joburg
+
+// jot : 2014-12-18 Amazon EU S.à r.l.
+jot
+
+// joy : 2014-12-18 Amazon EU S.à r.l.
+joy
+
+// jprs : 2014-09-18 Japan Registry Services Co., Ltd.
+jprs
+
+// juegos : 2014-03-20 Uniregistry, Corp.
+juegos
+
+// kaufen : 2013-11-07 United TLD Holdco Ltd.
+kaufen
+
+// kddi : 2014-09-12 KDDI CORPORATION
+kddi
+
+// kfh : 2014-12-04 Kuwait Finance House
+kfh
+
+// kim : 2013-09-23 Afilias Limited
+kim
+
+// kinder : 2014-11-07 Ferrero Trading Lux S.A.
+kinder
+
+// kitchen : 2013-09-20 Just Goodbye, LLC
+kitchen
+
+// kiwi : 2013-09-20 DOT KIWI LIMITED
+kiwi
+
+// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH
+koeln
+
+// komatsu : 2015-01-08 Komatsu Ltd.
+komatsu
+
+// kpn : 2015-01-08 Koninklijke KPN N.V.
+kpn
+
+// krd : 2013-12-05 KRG Department of Information Technology
+krd
+
+// kred : 2013-12-19 KredTLD Pty Ltd
+kred
+
+// kyknet : 2015-03-05 Electronic Media Network (Pty) Ltd
+kyknet
+
+// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen
+kyoto
+
+// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA
+lacaixa
+
+// lancaster : 2015-02-12 LANCASTER
+lancaster
+
+// land : 2013-09-10 Pine Moon, LLC
+land
+
+// landrover : 2014-11-13 Jaguar Land Rover Ltd
+landrover
+
+// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated
+lasalle
+
+// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico
+lat
+
+// latrobe : 2014-06-16 La Trobe University
+latrobe
+
+// law : 2015-01-22 Minds + Machines Group Limited
+law
+
+// lawyer : 2014-03-20
+lawyer
+
+// lds : 2014-03-20 IRI Domain Management, LLC (\
+lds
+
+// lease : 2014-03-06 Victor Trail, LLC
+lease
+
+// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc
+leclerc
+
+// legal : 2014-10-16 Blue Falls, LLC
+legal
+
+// lgbt : 2014-05-08 Afilias Limited
+lgbt
+
+// liaison : 2014-10-02 Liaison Technologies, Incorporated
+liaison
+
+// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
+lidl
+
+// life : 2014-02-06 Trixy Oaks, LLC
+life
+
+// lifeinsurance : 2015-01-15 American Council of Life Insurers
+lifeinsurance
+
+// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc.
+lifestyle
+
+// lighting : 2013-08-27 John McCook, LLC
+lighting
+
+// like : 2014-12-18 Amazon EU S.à r.l.
+like
+
+// limited : 2014-03-06 Big Fest, LLC
+limited
+
+// limo : 2013-10-17 Hidden Frostbite, LLC
+limo
+
+// lincoln : 2014-11-13 Ford Motor Company
+lincoln
+
+// linde : 2014-12-04 Linde Aktiengesellschaft
+linde
+
+// link : 2013-11-14 Uniregistry, Corp.
+link
+
+// live : 2014-12-04 Half Woods, LLC
+live
+
+// lixil : 2015-03-19 LIXIL Group Corporation
+lixil
+
+// loan : 2014-11-20 dot Loan Limited
+loan
+
+// loans : 2014-03-20 June Woods, LLC
+loans
+
+// lol : 2015-01-30 Uniregistry, Corp.
+lol
+
+// london : 2013-11-14 Dot London Domains Limited
+london
+
+// lotte : 2014-11-07 Lotte Holdings Co., Ltd.
+lotte
+
+// lotto : 2014-04-10 Afilias Limited
+lotto
+
+// love : 2014-12-22 Merchant Law Group LLP
+love
+
+// ltd : 2014-09-25 Over Corner, LLC
+ltd
+
+// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA
+ltda
+
+// lupin : 2014-11-07 LUPIN LIMITED
+lupin
+
+// luxe : 2014-01-09 Top Level Domain Holdings Limited
+luxe
+
+// luxury : 2013-10-17 Luxury Partners, LLC
+luxury
+
+// madrid : 2014-05-01 Comunidad de Madrid
+madrid
+
+// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF)
+maif
+
+// maison : 2013-12-05 Victor Frostbite, LLC
+maison
+
+// makeup : 2015-01-15 L'Oréal
+makeup
+
+// man : 2014-12-04 MAN SE
+man
+
+// management : 2013-11-07 John Goodbye, LLC
+management
+
+// mango : 2013-10-24 PUNTO FA S.L.
+mango
+
+// market : 2014-03-06
+market
+
+// marketing : 2013-11-07 Fern Pass, LLC
+marketing
+
+// markets : 2014-12-11 IG Group Holdings PLC
+markets
+
+// marriott : 2014-10-09 Marriott Worldwide Corporation
+marriott
+
+// mba : 2015-04-02 Lone Hollow, LLC
+mba
+
+// media : 2014-03-06 Grand Glen, LLC
+media
+
+// meet : 2014-01-16
+meet
+
+// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation
+melbourne
+
+// meme : 2014-01-30 Charleston Road Registry Inc.
+meme
+
+// memorial : 2014-10-16 Dog Beach, LLC
+memorial
+
+// men : 2015-02-26 Exclusive Registry Limited
+men
+
+// menu : 2013-09-11 Wedding TLD2, LLC
+menu
+
+// meo : 2014-11-07 PT Comunicacoes S.A.
+meo
+
+// miami : 2013-12-19 Top Level Domain Holdings Limited
+miami
+
+// microsoft : 2014-12-18 Microsoft Corporation
+microsoft
+
+// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft
+mini
+
+// mma : 2014-11-07 MMA IARD
+mma
+
+// mnet : 2015-03-05 Electronic Media Network (Pty) Ltd
+mnet
+
+// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L.
+mobily
+
+// moda : 2013-11-07 United TLD Holdco Ltd.
+moda
+
+// moe : 2013-11-13 Interlink Co., Ltd.
+moe
+
+// moi : 2014-12-18 Amazon EU S.à r.l.
+moi
+
+// monash : 2013-09-30 Monash University
+monash
+
+// money : 2014-10-16 Outer McCook, LLC
+money
+
+// montblanc : 2014-06-23 Richemont DNS Inc.
+montblanc
+
+// mormon : 2013-12-05 IRI Domain Management, LLC (\
+mormon
+
+// mortgage : 2014-03-20
+mortgage
+
+// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
+moscow
+
+// motorcycles : 2014-01-09 DERMotorcycles, LLC
+motorcycles
+
+// mov : 2014-01-30 Charleston Road Registry Inc.
+mov
+
+// movie : 2015-02-05 New Frostbite, LLC
+movie
+
+// movistar : 2014-10-16 Telefónica S.A.
+movistar
+
+// mtn : 2014-12-04 MTN Dubai Limited
+mtn
+
+// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation
+mtpc
+
+// mtr : 2015-03-12 MTR Corporation Limited
+mtr
+
+// multichoice : 2015-03-12 MultiChoice (Proprietary) Limited
+multichoice
+
+// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC
+mutual
+
+// mzansimagic : 2015-03-05 Electronic Media Network (Pty) Ltd
+mzansimagic
+
+// nadex : 2014-12-11 IG Group Holdings PLC
+nadex
+
+// nagoya : 2013-10-24 GMO Registry, Inc.
+nagoya
+
+// naspers : 2015-02-12 Intelprop (Proprietary) Limited
+naspers
+
+// natura : 2015-03-12 NATURA COSMÉTICOS S.A.
+natura
+
+// navy : 2014-03-06 United TLD Holdco Ltd.
+navy
+
+// nec : 2015-01-08 NEC Corporation
+nec
+
+// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+netbank
+
+// network : 2013-11-14 Trixy Manor, LLC
+network
+
+// neustar : 2013-12-05 NeuStar, Inc.
+neustar
+
+// new : 2014-01-30 Charleston Road Registry Inc.
+new
+
+// news : 2014-12-18
+news
+
+// nexus : 2014-07-24 Charleston Road Registry Inc.
+nexus
+
+// ngo : 2014-03-06 Public Interest Registry
+ngo
+
+// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK)
+nhk
+
+// nico : 2014-12-04 DWANGO Co., Ltd.
+nico
+
+// ninja : 2013-11-07 United TLD Holdco Ltd.
+ninja
+
+// nissan : 2014-03-27 NISSAN MOTOR CO., LTD.
+nissan
+
+// nokia : 2015-01-08 Nokia Corporation
+nokia
+
+// norton : 2014-12-04 Symantec Corporation
+norton
+
+// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+nowruz
+
+// nra : 2014-05-22 NRA Holdings Company, INC.
+nra
+
+// nrw : 2013-11-21 Minds + Machines GmbH
+nrw
+
+// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
+ntt
+
+// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications
+nyc
+
+// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA
+obi
+
+// office : 2015-03-12 Microsoft Corporation
+office
+
+// okinawa : 2013-12-05 BusinessRalliart Inc.
+okinawa
+
+// omega : 2015-01-08 The Swatch Group Ltd
+omega
+
+// one : 2014-11-07 One.com A/S
+one
+
+// ong : 2014-03-06 Public Interest Registry
+ong
+
+// onl : 2013-09-16 I-Registry Ltd.
+onl
+
+// online : 2015-01-15 DotOnline Inc.
+online
+
+// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED
+ooo
+
+// oracle : 2014-06-19 Oracle Corporation
+oracle
+
+// orange : 2015-03-12 Orange Brand Services Limited
+orange
+
+// organic : 2014-03-27 Afilias Limited
+organic
+
+// orientexpress : 2015-02-05 Belmond Ltd.
+orientexpress
+
+// osaka : 2014-09-04 Interlink Co., Ltd.
+osaka
+
+// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd.
+otsuka
+
+// ovh : 2014-01-16 OVH SAS
+ovh
+
+// page : 2014-12-04 Charleston Road Registry Inc.
+page
+
+// pamperedchef : 2015-02-05 The Pampered Chef, Ltd.
+pamperedchef
+
+// panerai : 2014-11-07 Richemont DNS Inc.
+panerai
+
+// paris : 2014-01-30 City of Paris
+paris
+
+// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+pars
+
+// partners : 2013-12-05 Magic Glen, LLC
+partners
+
+// parts : 2013-12-05 Sea Goodbye, LLC
+parts
+
+// party : 2014-09-11 Blue Sky Registry Limited
+party
+
+// passagens : 2015-03-05 Travel Reservations SRL
+passagens
+
+// payu : 2015-02-12 MIH PayU B.V.
+payu
+
+// pharmacy : 2014-06-19 National Association of Boards of Pharmacy
+pharmacy
+
+// philips : 2014-11-07 Koninklijke Philips N.V.
+philips
+
+// photo : 2013-11-14 Uniregistry, Corp.
+photo
+
+// photography : 2013-09-20 Sugar Glen, LLC
+photography
+
+// photos : 2013-10-17 Sea Corner, LLC
+photos
+
+// physio : 2014-05-01 PhysBiz Pty Ltd
+physio
+
+// piaget : 2014-10-16 Richemont DNS Inc.
+piaget
+
+// pics : 2013-11-14 Uniregistry, Corp.
+pics
+
+// pictet : 2014-06-26 Pictet Europe S.A.
+pictet
+
+// pictures : 2014-03-06 Foggy Sky, LLC
+pictures
+
+// pid : 2015-01-08 Top Level Spectrum, Inc.
+pid
+
+// pin : 2014-12-18 Amazon EU S.à r.l.
+pin
+
+// pink : 2013-10-01 Afilias Limited
+pink
+
+// pizza : 2014-06-26 Foggy Moon, LLC
+pizza
+
+// place : 2014-04-24 Snow Galley, LLC
+place
+
+// play : 2015-03-05 Charleston Road Registry Inc.
+play
+
+// plumbing : 2013-09-10 Spring Tigers, LLC
+plumbing
+
+// plus : 2015-02-05 Sugar Mill, LLC
+plus
+
+// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+pohl
+
+// poker : 2014-07-03 Afilias Domains No. 5 Limited
+poker
+
+// porn : 2014-10-16 ICM Registry PN LLC
+porn
+
+// praxi : 2013-12-05 Praxi S.p.A.
+praxi
+
+// press : 2014-04-03 DotPress Inc.
+press
+
+// prod : 2014-01-23 Charleston Road Registry Inc.
+prod
+
+// productions : 2013-12-05 Magic Birch, LLC
+productions
+
+// prof : 2014-07-24 Charleston Road Registry Inc.
+prof
+
+// promo : 2014-12-18 Play.PROMO Oy
+promo
+
+// properties : 2013-12-05 Big Pass, LLC
+properties
+
+// property : 2014-05-22 Uniregistry, Corp.
+property
+
+// pub : 2013-12-12 United TLD Holdco Ltd.
+pub
+
+// qpon : 2013-11-14 dotCOOL, Inc.
+qpon
+
+// quebec : 2013-12-19 PointQuébec Inc
+quebec
+
+// quest : 2015-03-26 Quest ION Limited
+quest
+
+// racing : 2014-12-04 Premier Registry Limited
+racing
+
+// read : 2014-12-18 Amazon EU S.à r.l.
+read
+
+// realtor : 2014-05-29 Real Estate Domains LLC
+realtor
+
+// realty : 2015-03-19 Fegistry, LLC
+realty
+
+// recipes : 2013-10-17 Grand Island, LLC
+recipes
+
+// red : 2013-11-07 Afilias Limited
+red
+
+// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd.
+redstone
+
+// redumbrella : 2015-03-26 Travelers TLD, LLC
+redumbrella
+
+// rehab : 2014-03-06 United TLD Holdco Ltd.
+rehab
+
+// reise : 2014-03-13 dotreise GmbH
+reise
+
+// reisen : 2014-03-06 New Cypress, LLC
+reisen
+
+// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc.
+reit
+
+// reliance : 2015-04-02 Reliance Industries Limited
+reliance
+
+// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd.
+ren
+
+// rent : 2014-12-04 DERRent, LLC
+rent
+
+// rentals : 2013-12-05 Big Hollow,LLC
+rentals
+
+// repair : 2013-11-07 Lone Sunset, LLC
+repair
+
+// report : 2013-12-05 Binky Glen, LLC
+report
+
+// republican : 2014-03-20 United TLD Holdco Ltd.
+republican
+
+// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
+rest
+
+// restaurant : 2014-07-03 Snow Avenue, LLC
+restaurant
+
+// review : 2014-11-20 dot Review Limited
+review
+
+// reviews : 2013-09-13
+reviews
+
+// rich : 2013-11-21 I-Registry Ltd.
+rich
+
+// ricoh : 2014-11-20 Ricoh Company, Ltd.
+ricoh
+
+// ril : 2015-04-02 Reliance Industries Limited
+ril
+
+// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO
+rio
+
+// rip : 2014-07-10 United TLD Holdco Ltd.
+rip
+
+// rocher : 2014-12-18 Ferrero Trading Lux S.A.
+rocher
+
+// rocks : 2013-11-14
+rocks
+
+// rodeo : 2013-12-19 Top Level Domain Holdings Limited
+rodeo
+
+// room : 2014-12-18 Amazon EU S.à r.l.
+room
+
+// rsvp : 2014-05-08 Charleston Road Registry Inc.
+rsvp
+
+// ruhr : 2013-10-02 regiodot GmbH & Co. KG
+ruhr
+
+// run : 2015-03-19 Snow Park, LLC
+run
+
+// rwe : 2015-04-02 RWE AG
+rwe
+
+// ryukyu : 2014-01-09 BusinessRalliart Inc.
+ryukyu
+
+// saarland : 2013-12-12 dotSaarland GmbH
+saarland
+
+// safe : 2014-12-18 Amazon EU S.à r.l.
+safe
+
+// safety : 2015-01-08 Safety Registry Services, LLC.
+safety
+
+// sakura : 2014-12-18 SAKURA Internet Inc.
+sakura
+
+// sale : 2014-10-16
+sale
+
+// salon : 2014-12-11 Outer Orchard, LLC
+salon
+
+// samsung : 2014-04-03 SAMSUNG SDS CO., LTD
+samsung
+
+// sandvik : 2014-11-13 Sandvik AB
+sandvik
+
+// sandvikcoromant : 2014-11-07 Sandvik AB
+sandvikcoromant
+
+// sanofi : 2014-10-09 Sanofi
+sanofi
+
+// sap : 2014-03-27 SAP AG
+sap
+
+// sapo : 2014-11-07 PT Comunicacoes S.A.
+sapo
+
+// sarl : 2014-07-03 Delta Orchard, LLC
+sarl
+
+// sas : 2015-04-02 Research IP LLC
+sas
+
+// saxo : 2014-10-31 Saxo Bank A/S
+saxo
+
+// sbi : 2015-03-12 STATE BANK OF INDIA
+sbi
+
+// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION
+sbs
+
+// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ)
+sca
+
+// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited (\
+scb
+
+// schmidt : 2014-04-03 SALM S.A.S.
+schmidt
+
+// scholarships : 2014-04-24 Scholarships.com, LLC
+scholarships
+
+// school : 2014-12-18 Little Galley, LLC
+school
+
+// schule : 2014-03-06 Outer Moon, LLC
+schule
+
+// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
+schwarz
+
+// science : 2014-09-11 dot Science Limited
+science
+
+// scor : 2014-10-31 SCOR SE
+scor
+
+// scot : 2014-01-23 Dot Scot Registry Limited
+scot
+
+// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal)
+seat
+
+// seek : 2014-12-04 Seek Limited
+seek
+
+// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A.
+sener
+
+// services : 2014-02-27 Fox Castle, LLC
+services
+
+// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG
+sew
+
+// sex : 2014-11-13 ICM Registry SX LLC
+sex
+
+// sexy : 2013-09-11 Uniregistry, Corp.
+sexy
+
+// sharp : 2014-05-01 Sharp Corporation
+sharp
+
+// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+shia
+
+// shiksha : 2013-11-14 Afilias Limited
+shiksha
+
+// shoes : 2013-10-02 Binky Galley, LLC
+shoes
+
+// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+shouji
+
+// show : 2015-03-05 Snow Beach, LLC
+show
+
+// shriram : 2014-01-23 Shriram Capital Ltd.
+shriram
+
+// sina : 2015-03-12 Sina Corporation
+sina
+
+// singles : 2013-08-27 Fern Madison, LLC
+singles
+
+// site : 2015-01-15 DotSite Inc.
+site
+
+// skin : 2015-01-15 L'Oréal
+skin
+
+// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch
+sky
+
+// skype : 2014-12-18 Microsoft Corporation
+skype
+
+// smile : 2014-12-18 Amazon EU S.à r.l.
+smile
+
+// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F
+sncf
+
+// soccer : 2015-03-26 Foggy Shadow, LLC
+soccer
+
+// social : 2013-11-07 United TLD Holdco Ltd.
+social
+
+// software : 2014-03-20
+software
+
+// sohu : 2013-12-19 Sohu.com Limited
+sohu
+
+// solar : 2013-11-07 Ruby Town, LLC
+solar
+
+// solutions : 2013-11-07 Silver Cover, LLC
+solutions
+
+// song : 2015-02-26 Amazon EU S.à r.l.
+song
+
+// sony : 2015-01-08 Sony Corporation
+sony
+
+// soy : 2014-01-23 Charleston Road Registry Inc.
+soy
+
+// space : 2014-04-03 DotSpace Inc.
+space
+
+// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG
+spiegel
+
+// spot : 2015-02-26 Amazon EU S.à r.l.
+spot
+
+// spreadbetting : 2014-12-11 IG Group Holdings PLC
+spreadbetting
+
+// stada : 2014-11-13 STADA Arzneimittel AG
+stada
+
+// star : 2015-01-08 Star India Private Limited
+star
+
+// starhub : 2015-02-05 StarHub Limited
+starhub
+
+// statebank : 2015-03-12 STATE BANK OF INDIA
+statebank
+
+// statoil : 2014-12-04 Statoil ASA
+statoil
+
+// stc : 2014-10-09 Saudi Telecom Company
+stc
+
+// stcgroup : 2014-10-09 Saudi Telecom Company
+stcgroup
+
+// stockholm : 2014-12-18 Stockholms kommun
+stockholm
+
+// storage : 2014-12-22 Self Storage Company LLC
+storage
+
+// studio : 2015-02-11 Spring Goodbye, LLC
+studio
+
+// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD
+study
+
+// style : 2014-12-04 Binky Moon, LLC
+style
+
+// sucks : 2014-12-22 Vox Populi Registry Inc.
+sucks
+
+// supersport : 2015-03-05 SuperSport International Holdings Proprietary Limited
+supersport
+
+// supplies : 2013-12-19 Atomic Fields, LLC
+supplies
+
+// supply : 2013-12-19 Half Falls, LLC
+supply
+
+// support : 2013-10-24 Grand Orchard, LLC
+support
+
+// surf : 2014-01-09 Top Level Domain Holdings Limited
+surf
+
+// surgery : 2014-03-20 Tin Avenue, LLC
+surgery
+
+// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION
+suzuki
+
+// swatch : 2015-01-08 The Swatch Group Ltd
+swatch
+
+// swiss : 2014-10-16 Swiss Confederation
+swiss
+
+// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet
+sydney
+
+// symantec : 2014-12-04 Symantec Corporation
+symantec
+
+// systems : 2013-11-07 Dash Cypress, LLC
+systems
+
+// tab : 2014-12-04 Tabcorp Holdings Limited
+tab
+
+// taipei : 2014-07-10 Taipei City Government
+taipei
+
+// taobao : 2015-01-15 Alibaba Group Holding Limited
+taobao
+
+// tatamotors : 2015-03-12 Tata Motors Ltd
+tatamotors
+
+// tatar : 2014-04-24 Limited Liability Company \
+tatar
+
+// tattoo : 2013-08-30 Uniregistry, Corp.
+tattoo
+
+// tax : 2014-03-20 Storm Orchard, LLC
+tax
+
+// taxi : 2015-03-19 Pine Falls, LLC
+taxi
+
+// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+tci
+
+// team : 2015-03-05 Atomic Lake, LLC
+team
+
+// tech : 2015-01-30 Dot Tech LLC
+tech
+
+// technology : 2013-09-13 Auburn Falls
+technology
+
+// telecity : 2015-02-19 TelecityGroup International Limited
+telecity
+
+// telefonica : 2014-10-16 Telefónica S.A.
+telefonica
+
+// temasek : 2014-08-07 Temasek Holdings (Private) Limited
+temasek
+
+// tennis : 2014-12-04 Cotton Bloom, LLC
+tennis
+
+// thd : 2015-04-02 Homer TLC, Inc.
+thd
+
+// theater : 2015-03-19 Blue Tigers, LLC
+theater
+
+// tickets : 2015-02-05 Accent Media Limited
+tickets
+
+// tienda : 2013-11-14 Victor Manor, LLC
+tienda
+
+// tiffany : 2015-01-30 Tiffany and Company
+tiffany
+
+// tips : 2013-09-20 Corn Willow, LLC
+tips
+
+// tires : 2014-11-07 Dog Edge, LLC
+tires
+
+// tirol : 2014-04-24 punkt Tirol GmbH
+tirol
+
+// tmall : 2015-01-15 Alibaba Group Holding Limited
+tmall
+
+// today : 2013-09-20 Pearl Woods, LLC
+today
+
+// tokyo : 2013-11-13 GMO Registry, Inc.
+tokyo
+
+// tools : 2013-11-21 Pioneer North, LLC
+tools
+
+// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd.
+top
+
+// toray : 2014-12-18 Toray Industries, Inc.
+toray
+
+// toshiba : 2014-04-10 TOSHIBA Corporation
+toshiba
+
+// tours : 2015-01-22 Sugar Station, LLC
+tours
+
+// town : 2014-03-06 Koko Moon, LLC
+town
+
+// toys : 2014-03-06 Pioneer Orchard, LLC
+toys
+
+// trade : 2014-01-23 Elite Registry Limited
+trade
+
+// trading : 2014-12-11 IG Group Holdings PLC
+trading
+
+// training : 2013-11-07 Wild Willow, LLC
+training
+
+// travelers : 2015-03-26 Travelers TLD, LLC
+travelers
+
+// travelersinsurance : 2015-03-26 Travelers TLD, LLC
+travelersinsurance
+
+// trust : 2014-10-16
+trust
+
+// trv : 2015-03-26 Travelers TLD, LLC
+trv
+
+// tui : 2014-07-03 TUI AG
+tui
+
+// tunes : 2015-02-26 Amazon EU S.à r.l.
+tunes
+
+// tushu : 2014-12-18 Amazon EU S.à r.l.
+tushu
+
+// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED
+tvs
+
+// ubs : 2014-12-11 UBS AG
+ubs
+
+// university : 2014-03-06 Little Station, LLC
+university
+
+// uno : 2013-09-11 Dot Latin LLC
+uno
+
+// uol : 2014-05-01 UBN INTERNET LTDA.
+uol
+
+// vacations : 2013-12-05 Atomic Tigers, LLC
+vacations
+
+// vana : 2014-12-11 Lifestyle Domain Holdings, Inc.
+vana
+
+// vegas : 2014-01-16 Dot Vegas, Inc.
+vegas
+
+// ventures : 2013-08-27 Binky Lake, LLC
+ventures
+
+// versicherung : 2014-03-20 dotversicherung-registry GmbH
+versicherung
+
+// vet : 2014-03-06
+vet
+
+// viajes : 2013-10-17 Black Madison, LLC
+viajes
+
+// video : 2014-10-16
+video
+
+// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd.
+viking
+
+// villas : 2013-12-05 New Sky, LLC
+villas
+
+// vip : 2015-01-22 Minds + Machines Group Limited
+vip
+
+// virgin : 2014-09-25 Virgin Enterprises Limited
+virgin
+
+// vision : 2013-12-05 Koko Station, LLC
+vision
+
+// vista : 2014-09-18 Vistaprint Limited
+vista
+
+// vistaprint : 2014-09-18 Vistaprint Limited
+vistaprint
+
+// viva : 2014-11-07 Saudi Telecom Company
+viva
+
+// vlaanderen : 2014-02-06 DNS.be vzw
+vlaanderen
+
+// vodka : 2013-12-19 Top Level Domain Holdings Limited
+vodka
+
+// vote : 2013-11-21 Monolith Registry LLC
+vote
+
+// voting : 2013-11-13 Valuetainment Corp.
+voting
+
+// voto : 2013-11-21 Monolith Registry LLC
+voto
+
+// voyage : 2013-08-27 Ruby House, LLC
+voyage
+
+// vuelos : 2015-03-05 Travel Reservations SRL
+vuelos
+
+// wales : 2014-05-08 Nominet UK
+wales
+
+// walter : 2014-11-13 Sandvik AB
+walter
+
+// wang : 2013-10-24 Zodiac Leo Limited
+wang
+
+// wanggou : 2014-12-18 Amazon EU S.à r.l.
+wanggou
+
+// watch : 2013-11-14 Sand Shadow, LLC
+watch
+
+// watches : 2014-12-22 Richemont DNS Inc.
+watches
+
+// weather : 2015-01-08 The Weather Channel, LLC
+weather
+
+// weatherchannel : 2015-03-12 The Weather Channel, LLC
+weatherchannel
+
+// webcam : 2014-01-23 dot Webcam Limited
+webcam
+
+// website : 2014-04-03 DotWebsite Inc.
+website
+
+// wed : 2013-10-01 Atgron, Inc.
+wed
+
+// wedding : 2014-04-24 Top Level Domain Holdings Limited
+wedding
+
+// weibo : 2015-03-05 Sina Corporation
+weibo
+
+// weir : 2015-01-29 Weir Group IP Limited
+weir
+
+// whoswho : 2014-02-20 Who's Who Registry
+whoswho
+
+// wien : 2013-10-28 punkt.wien GmbH
+wien
+
+// wiki : 2013-11-07 Top Level Design, LLC
+wiki
+
+// williamhill : 2014-03-13 William Hill Organization Limited
+williamhill
+
+// win : 2014-11-20 First Registry Limited
+win
+
+// windows : 2014-12-18 Microsoft Corporation
+windows
+
+// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC
+wme
+
+// work : 2013-12-19 Top Level Domain Holdings Limited
+work
+
+// works : 2013-11-14 Little Dynamite, LLC
+works
+
+// world : 2014-06-12 Bitter Fields, LLC
+world
+
+// wtc : 2013-12-19 World Trade Centers Association, Inc.
+wtc
+
+// wtf : 2014-03-06 Hidden Way, LLC
+wtf
+
+// xbox : 2014-12-18 Microsoft Corporation
+xbox
+
+// xerox : 2014-10-24 Xerox DNHC LLC
+xerox
+
+// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+xihuan
+
+// xin : 2014-12-11 Elegant Leader Limited
+xin
+
+// xn--11b4c3d : 2015-01-15 VeriSign Sarl
+कॉम
+
+// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l.
+セール
+
+// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd.
+佛山
+
+// xn--30rr7y : 2014-06-12 Excellent First Limited
+慈善
+
+// xn--3bst00m : 2013-09-13 Eagle Horizon Limited
+集团
+
+// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED
+在线
+
+// xn--3pxu8k : 2015-01-15 VeriSign Sarl
+点看
+
+// xn--42c2d9a : 2015-01-15 VeriSign Sarl
+คอม
+
+// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited
+八卦
+
+// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment
+موقع
+
+// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center
+公益
+
+// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
+公司
+
+// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited
+网站
+
+// xn--6frz82g : 2013-09-23 Afilias Limited
+移动
+
+// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited
+我爱你
+
+// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
+москва
+
+// xn--80asehdb : 2013-07-14 CORE Association
+онлайн
+
+// xn--80aswg : 2013-07-14 CORE Association
+сайт
+
+// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited
+联通
+
+// xn--9dbq2a : 2015-01-15 VeriSign Sarl
+קום
+
+// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED
+时尚
+
+// xn--9krt00a : 2015-03-12 Sina Corporation
+微博
+
+// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited
+淡马锡
+
+// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l.
+ファッション
+
+// xn--c1avg : 2013-11-14 Public Interest Registry
+орг
+
+// xn--c2br7g : 2015-01-15 VeriSign Sarl
+नेट
+
+// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l.
+ストア
+
+// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD
+삼성
+
+// xn--czr694b : 2014-01-16 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY.HONGKONG LIMITED
+商标
+
+// xn--czrs0t : 2013-12-19 Wild Island, LLC
+商店
+
+// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited
+商城
+
+// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet”
+дети
+
+// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l.
+ポイント
+
+// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社
+新闻
+
+// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited
+工行
+
+// xn--fhbei : 2015-01-15 VeriSign Sarl
+كوم
+
+// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED
+中文网
+
+// xn--fiq64b : 2013-10-14 CITIC Group Corporation
+中信
+
+// xn--fjq720a : 2014-05-22 Will Bloom, LLC
+娱乐
+
+// xn--flw351e : 2014-07-31 Charleston Road Registry Inc.
+谷歌
+
+// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited
+购物
+
+// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l.
+クラウド
+
+// xn--hxt814e : 2014-05-15 Zodiac Libra Limited
+网店
+
+// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry
+संगठन
+
+// xn--imr513n : 2014-12-11 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY. HONGKONG LIMITED
+餐厅
+
+// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
+网络
+
+// xn--j1aef : 2015-01-15 VeriSign Sarl
+ком
+
+// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation
+诺基亚
+
+// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l.
+食品
+
+// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V.
+飞利浦
+
+// xn--kpu716f : 2014-12-22 Richemont DNS Inc.
+手表
+
+// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd
+手机
+
+// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company
+ارامكو
+
+// xn--mgbab2bd : 2013-10-31 CORE Association
+بازار
+
+// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L.
+موبايلي
+
+// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+همراه
+
+// xn--mk1bu44c : 2015-01-15 VeriSign Sarl
+닷컴
+
+// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd.
+政府
+
+// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd.
+شبكة
+
+// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House
+بيتك
+
+// xn--nqv7f : 2013-11-14 Public Interest Registry
+机构
+
+// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry
+组织机构
+
+// xn--nyqy26a : 2014-11-07 Stable Tone Limited
+健康
+
+// xn--p1acf : 2013-12-12 Rusnames Limited
+рус
+
+// xn--pbt977c : 2014-12-22 Richemont DNS Inc.
+珠宝
+
+// xn--pssy2u : 2015-01-15 VeriSign Sarl
+大拿
+
+// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc.
+みんな
+
+// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc.
+グーグル
+
+// xn--rhqv96g : 2013-09-11 Stable Tone Limited
+世界
+
+// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l.
+書籍
+
+// xn--ses554g : 2014-01-16
+网址
+
+// xn--t60b56a : 2015-01-15 VeriSign Sarl
+닷넷
+
+// xn--tckwe : 2015-01-15 VeriSign Sarl
+コム
+
+// xn--unup4y : 2013-07-14 Spring Fields, LLC
+游戏
+
+// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+vermögensberater
+
+// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+vermögensberatung
+
+// xn--vhquv : 2013-08-27 Dash McCook, LLC
+企业
+
+// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd.
+信息
+
+// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd.
+广东
+
+// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center
+政务
+
+// xyz : 2013-12-05 XYZ.COM LLC
+xyz
+
+// yachts : 2014-01-09 DERYachts, LLC
+yachts
+
+// yahoo : 2015-04-02 Yahoo! Domain Services Inc.
+yahoo
+
+// yamaxun : 2014-12-18 Amazon EU S.à r.l.
+yamaxun
+
+// yandex : 2014-04-10 YANDEX, LLC
+yandex
+
+// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
+yodobashi
+
+// yoga : 2014-05-29 Top Level Domain Holdings Limited
+yoga
+
+// yokohama : 2013-12-12 GMO Registry, Inc.
+yokohama
+
+// youtube : 2014-05-01 Charleston Road Registry Inc.
+youtube
+
+// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+yun
+
+// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.)
+zara
+
+// zero : 2014-12-18 Amazon EU S.à r.l.
+zero
+
+// zip : 2014-05-08 Charleston Road Registry Inc.
+zip
+
+// zone : 2013-11-14 Outer Falls, LLC
+zone
+
+// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich)
+zuerich
+
+
+// ===END ICANN DOMAINS===
+// ===BEGIN PRIVATE DOMAINS===
+// (Note: these are in alphabetical order by company name)
+
+// Amazon CloudFront : https://aws.amazon.com/cloudfront/
+// Submitted by Donavan Miller <donavanm@amazon.com> 2013-03-22
+cloudfront.net
+
+// Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/
+// Submitted by Osman Surkatty <osmans@amazon.com> 2014-12-16
+ap-northeast-1.compute.amazonaws.com
+ap-southeast-1.compute.amazonaws.com
+ap-southeast-2.compute.amazonaws.com
+cn-north-1.compute.amazonaws.cn
+compute.amazonaws.cn
+compute.amazonaws.com
+compute-1.amazonaws.com
+eu-west-1.compute.amazonaws.com
+eu-central-1.compute.amazonaws.com
+sa-east-1.compute.amazonaws.com
+us-east-1.amazonaws.com
+us-gov-west-1.compute.amazonaws.com
+us-west-1.compute.amazonaws.com
+us-west-2.compute.amazonaws.com
+z-1.compute-1.amazonaws.com
+z-2.compute-1.amazonaws.com
+
+// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/
+// Submitted by Adam Stein <astein@amazon.com> 2013-04-02
+elasticbeanstalk.com
+
+// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/
+// Submitted by Scott Vidmar <svidmar@amazon.com> 2013-03-27
+elb.amazonaws.com
+
+// Amazon S3 : https://aws.amazon.com/s3/
+// Submitted by Courtney Eckhardt <coec@amazon.com> 2013-03-22
+s3.amazonaws.com
+s3-us-west-2.amazonaws.com
+s3-us-west-1.amazonaws.com
+s3-eu-west-1.amazonaws.com
+s3-ap-southeast-1.amazonaws.com
+s3-ap-southeast-2.amazonaws.com
+s3-ap-northeast-1.amazonaws.com
+s3-sa-east-1.amazonaws.com
+s3-us-gov-west-1.amazonaws.com
+s3-fips-us-gov-west-1.amazonaws.com
+s3-website-us-east-1.amazonaws.com
+s3-website-us-west-2.amazonaws.com
+s3-website-us-west-1.amazonaws.com
+s3-website-eu-west-1.amazonaws.com
+s3-website-ap-southeast-1.amazonaws.com
+s3-website-ap-southeast-2.amazonaws.com
+s3-website-ap-northeast-1.amazonaws.com
+s3-website-sa-east-1.amazonaws.com
+s3-website-us-gov-west-1.amazonaws.com
+
+// BetaInABox
+// Submitted by adrian@betainabox.com 2012-09-13
+betainabox.com
// CentralNic : http://www.centralnic.com/names/domains
-// Confirmed by registry <gavin.brown@centralnic.com> 2008-06-09
+// Submitted by registry <gavin.brown@centralnic.com> 2012-09-27
+ae.org
ar.com
br.com
cn.com
+com.de
+com.se
de.com
eu.com
gb.com
-gr.com
+gb.net
hu.com
+hu.net
+jp.net
jpn.com
kr.com
+mex.com
no.com
qc.com
ru.com
sa.com
se.com
+se.net
uk.com
+uk.net
us.com
uy.com
+za.bz
za.com
-gb.net
-jp.net
-se.net
-uk.net
-ae.org
-us.org
-com.de
-// Opera Software, A.S.A.
-// Requested by Yngve Pettersen <yngve@opera.com> 2009-11-26
-operaunite.com
+// Africa.com Web Solutions Ltd : https://registry.africa.com
+// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
+africa.com
-// Google, Inc.
-// Requested by Eduardo Vela <evn@google.com> 2010-09-06
-appspot.com
+// iDOT Services Limited : http://www.domain.gr.com
+// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
+gr.com
-// iki.fi : Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05
-iki.fi
+// Radix FZC : http://domains.in.net
+// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
+in.net
+
+// US REGISTRY LLC : http://us.org
+// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
+us.org
+
+// co.com Registry, LLC : https://registry.co.com
+// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
+co.com
// c.la : http://www.c.la/
c.la
-// ZaNiC : http://www.za.net/
-// Confirmed by registry <hostmaster@nic.za.net> 2009-10-03
-za.net
-za.org
+// cloudControl : https://www.cloudcontrol.com/
+// Submitted by Tobias Wilken <tw@cloudcontrol.com> 2013-07-23
+cloudcontrolled.com
+cloudcontrolapp.com
+
+// co.ca : http://registry.co.ca/
+co.ca
// CoDNS B.V.
-// Added 2010-05-23.
co.nl
co.no
-// Mainseek Sp. z o.o. : http://www.co.pl/
-co.pl
+// Commerce Guys, SAS
+// Submitted by Damien Tournoud <damien@commerceguys.com> 2015-01-22
+*.platform.sh
+
+// Cupcake : https://cupcake.io/
+// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> 2013-10-08
+cupcake.is
+
+// DreamHost : http://www.dreamhost.com/
+// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> 2012-10-02
+dreamhosters.com
// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/
dyndns-at-home.com
@@ -5226,4 +9908,172 @@ webhop.org
worse-than.tv
writesthisblog.com
+// Fastly Inc. http://www.fastly.com/
+// Submitted by Vladimir Vuksan <vladimir@fastly.com> 2013-05-31
+a.ssl.fastly.net
+b.ssl.fastly.net
+global.ssl.fastly.net
+a.prod.fastly.net
+global.prod.fastly.net
+
+// Firebase, Inc.
+// Submitted by Chris Raynor <chris@firebase.com> 2014-01-21
+firebaseapp.com
+
+// Flynn : https://flynn.io
+// Submitted by Jonathan Rudenberg <jonathan@flynn.io> 2014-07-12
+flynnhub.com
+
+// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains
+// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> 2014-08-28
+service.gov.uk
+
+// GitHub, Inc.
+// Submitted by Ben Toews <btoews@github.com> 2014-02-06
+github.io
+githubusercontent.com
+
+// GlobeHosting, Inc.
+// Submitted by Zoltan Egresi <egresi@globehosting.com> 2013-07-12
+ro.com
+
+// Google, Inc.
+// Submitted by Eduardo Vela <evn@google.com> 2014-12-19
+appspot.com
+blogspot.ae
+blogspot.be
+blogspot.bj
+blogspot.ca
+blogspot.cf
+blogspot.ch
+blogspot.co.at
+blogspot.co.il
+blogspot.co.nz
+blogspot.co.uk
+blogspot.com
+blogspot.com.ar
+blogspot.com.au
+blogspot.com.br
+blogspot.com.es
+blogspot.com.tr
+blogspot.cv
+blogspot.cz
+blogspot.de
+blogspot.dk
+blogspot.fi
+blogspot.fr
+blogspot.gr
+blogspot.hk
+blogspot.hu
+blogspot.ie
+blogspot.in
+blogspot.it
+blogspot.jp
+blogspot.kr
+blogspot.mr
+blogspot.mx
+blogspot.nl
+blogspot.no
+blogspot.pt
+blogspot.re
+blogspot.ro
+blogspot.ru
+blogspot.se
+blogspot.sg
+blogspot.sk
+blogspot.td
+blogspot.tw
+codespot.com
+googleapis.com
+googlecode.com
+pagespeedmobilizer.com
+withgoogle.com
+
+// Heroku : https://www.heroku.com/
+// Submitted by Tom Maher <tmaher@heroku.com> 2013-05-02
+herokuapp.com
+herokussl.com
+
+// iki.fi
+// Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05
+iki.fi
+
+// info.at : http://www.info.at/
+biz.at
+info.at
+
+// Michau Enterprises Limited : http://www.co.pl/
+co.pl
+
+// Microsoft : http://microsoft.com
+// Submitted by Barry Dorrans <bdorrans@microsoft.com> 2014-01-24
+azurewebsites.net
+azure-mobile.net
+cloudapp.net
+
+// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/
+// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> 2014-02-02
+nfshost.com
+
+// NYC.mn : http://www.information.nyc.mn
+// Submitted by Matthew Brown <mattbrown@nyc.mn> 2013-03-11
+nyc.mn
+
+// One Fold Media : http://www.onefoldmedia.com/
+// Submitted by Eddie Jones <eddie@onefoldmedia.com> 2014-06-10
+nid.io
+
+// Opera Software, A.S.A.
+// Submitted by Yngve Pettersen <yngve@opera.com> 2009-11-26
+operaunite.com
+
+// OutSystems
+// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> 2014-03-11
+outsystemscloud.com
+
+// .pl domains (grandfathered)
+art.pl
+gliwice.pl
+krakow.pl
+poznan.pl
+wroc.pl
+zakopane.pl
+
+// priv.at : http://www.nic.priv.at/
+// Submitted by registry <lendl@nic.at> 2008-06-09
+priv.at
+
+// Red Hat, Inc. OpenShift : https://openshift.redhat.com/
+// Submitted by Tim Kramer <tkramer@rhcloud.com> 2012-10-24
+rhcloud.com
+
+// SinaAppEngine : http://sae.sina.com.cn/
+// Submitted by SinaAppEngine <saesupport@sinacloud.com> 2015-02-02
+sinaapp.com
+vipsinaapp.com
+1kapp.com
+
+// TASK geographical domains (www.task.gda.pl/uslugi/dns)
+gda.pl
+gdansk.pl
+gdynia.pl
+med.pl
+sopot.pl
+
+// UDR Limited : http://www.udr.hk.com
+// Submitted by registry <hostmaster@udr.hk.com> 2014-11-07
+hk.com
+hk.org
+ltd.hk
+inc.hk
+
+// Yola : https://www.yola.com/
+// Submitted by Stefano Rivera <stefano@yola.com> 2014-07-09
+yolasite.com
+
+// ZaNiC : http://www.za.net/
+// Submitted by registry <hostmaster@nic.za.net> 2009-10-03
+za.net
+za.org
+
// ===END PRIVATE DOMAINS===
diff --git a/node_modules/request/node_modules/tough-cookie/test.js b/node_modules/request/node_modules/tough-cookie/test.js
deleted file mode 100644
index 5cbf536ca..000000000
--- a/node_modules/request/node_modules/tough-cookie/test.js
+++ /dev/null
@@ -1,1625 +0,0 @@
-/*
- * Copyright GoInstant, Inc. and other 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.
- */
-'use strict';
-var vows = require('vows');
-var assert = require('assert');
-var async = require('async');
-
-// NOTE use require("tough-cookie") in your own code:
-var tough = require('./lib/cookie');
-var Cookie = tough.Cookie;
-var CookieJar = tough.CookieJar;
-
-
-function dateVows(table) {
- var theVows = { };
- Object.keys(table).forEach(function(date) {
- var expect = table[date];
- theVows[date] = function() {
- var got = tough.parseDate(date) ? 'valid' : 'invalid';
- assert.equal(got, expect ? 'valid' : 'invalid');
- };
- });
- return { "date parsing": theVows };
-}
-
-function matchVows(func,table) {
- var theVows = {};
- table.forEach(function(item) {
- var str = item[0];
- var dom = item[1];
- var expect = item[2];
- var label = str+(expect?" matches ":" doesn't match ")+dom;
- theVows[label] = function() {
- assert.equal(func(str,dom),expect);
- };
- });
- return theVows;
-}
-
-function defaultPathVows(table) {
- var theVows = {};
- table.forEach(function(item) {
- var str = item[0];
- var expect = item[1];
- var label = str+" gives "+expect;
- theVows[label] = function() {
- assert.equal(tough.defaultPath(str),expect);
- };
- });
- return theVows;
-}
-
-var atNow = Date.now();
-function at(offset) { return {now: new Date(atNow+offset)}; }
-
-vows.describe('Cookie Jar')
-.addBatch({
- "all defined": function() {
- assert.ok(Cookie);
- assert.ok(CookieJar);
- },
-})
-.addBatch(
- dateVows({
- "Wed, 09 Jun 2021 10:18:14 GMT": true,
- "Wed, 09 Jun 2021 22:18:14 GMT": true,
- "Tue, 18 Oct 2011 07:42:42.123 GMT": true,
- "18 Oct 2011 07:42:42 GMT": true,
- "8 Oct 2011 7:42:42 GMT": true,
- "8 Oct 2011 7:2:42 GMT": false,
- "Oct 18 2011 07:42:42 GMT": true,
- "Tue Oct 18 2011 07:05:03 GMT+0000 (GMT)": true,
- "09 Jun 2021 10:18:14 GMT": true,
- "99 Jix 3038 48:86:72 ZMT": false,
- '01 Jan 1970 00:00:00 GMT': true,
- '01 Jan 1600 00:00:00 GMT': false, // before 1601
- '01 Jan 1601 00:00:00 GMT': true,
- '10 Feb 81 13:00:00 GMT': true, // implicit year
- 'Thu, 01 Jan 1970 00:00:010 GMT': true, // strange time, non-strict OK
- 'Thu, 17-Apr-2014 02:12:29 GMT': true, // dashes
- 'Thu, 17-Apr-2014 02:12:29 UTC': true, // dashes and UTC
- })
-)
-.addBatch({
- "strict date parse of Thu, 01 Jan 1970 00:00:010 GMT": {
- topic: function() {
- return tough.parseDate('Thu, 01 Jan 1970 00:00:010 GMT', true) ? true : false;
- },
- "invalid": function(date) {
- assert.equal(date,false);
- },
- }
-})
-.addBatch({
- "formatting": {
- "a simple cookie": {
- topic: function() {
- var c = new Cookie();
- c.key = 'a';
- c.value = 'b';
- return c;
- },
- "validates": function(c) {
- assert.ok(c.validate());
- },
- "to string": function(c) {
- assert.equal(c.toString(), 'a=b');
- },
- },
- "a cookie with spaces in the value": {
- topic: function() {
- var c = new Cookie();
- c.key = 'a';
- c.value = 'beta gamma';
- return c;
- },
- "doesn't validate": function(c) {
- assert.ok(!c.validate());
- },
- "'garbage in, garbage out'": function(c) {
- assert.equal(c.toString(), 'a=beta gamma');
- },
- },
- "with an empty value and HttpOnly": {
- topic: function() {
- var c = new Cookie();
- c.key = 'a';
- c.httpOnly = true;
- return c;
- },
- "to string": function(c) {
- assert.equal(c.toString(), 'a=; HttpOnly');
- }
- },
- "with an expiry": {
- topic: function() {
- var c = new Cookie();
- c.key = 'a';
- c.value = 'b';
- c.setExpires("Oct 18 2011 07:05:03 GMT");
- return c;
- },
- "validates": function(c) {
- assert.ok(c.validate());
- },
- "to string": function(c) {
- assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT');
- },
- "to short string": function(c) {
- assert.equal(c.cookieString(), 'a=b');
- },
- },
- "with a max-age": {
- topic: function() {
- var c = new Cookie();
- c.key = 'a';
- c.value = 'b';
- c.setExpires("Oct 18 2011 07:05:03 GMT");
- c.maxAge = 12345;
- return c;
- },
- "validates": function(c) {
- assert.ok(c.validate()); // mabe this one *shouldn't*?
- },
- "to string": function(c) {
- assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345');
- },
- },
- "with a bunch of things": function() {
- var c = new Cookie();
- c.key = 'a';
- c.value = 'b';
- c.setExpires("Oct 18 2011 07:05:03 GMT");
- c.maxAge = 12345;
- c.domain = 'example.com';
- c.path = '/foo';
- c.secure = true;
- c.httpOnly = true;
- c.extensions = ['MyExtension'];
- assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345; Domain=example.com; Path=/foo; Secure; HttpOnly; MyExtension');
- },
- "a host-only cookie": {
- topic: function() {
- var c = new Cookie();
- c.key = 'a';
- c.value = 'b';
- c.hostOnly = true;
- c.domain = 'shouldnt-stringify.example.com';
- c.path = '/should-stringify';
- return c;
- },
- "validates": function(c) {
- assert.ok(c.validate());
- },
- "to string": function(c) {
- assert.equal(c.toString(), 'a=b; Path=/should-stringify');
- },
- },
- "minutes are '10'": {
- topic: function() {
- var c = new Cookie();
- c.key = 'a';
- c.value = 'b';
- c.expires = new Date(1284113410000);
- return c;
- },
- "validates": function(c) {
- assert.ok(c.validate());
- },
- "to string": function(c) {
- var str = c.toString();
- assert.notEqual(str, 'a=b; Expires=Fri, 010 Sep 2010 010:010:010 GMT');
- assert.equal(str, 'a=b; Expires=Fri, 10 Sep 2010 10:10:10 GMT');
- },
- }
- }
-})
-.addBatch({
- "TTL with max-age": function() {
- var c = new Cookie();
- c.maxAge = 123;
- assert.equal(c.TTL(), 123000);
- assert.equal(c.expiryTime(new Date(9000000)), 9123000);
- },
- "TTL with zero max-age": function() {
- var c = new Cookie();
- c.key = 'a'; c.value = 'b';
- c.maxAge = 0; // should be treated as "earliest representable"
- assert.equal(c.TTL(), 0);
- assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
- assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
- },
- "TTL with negative max-age": function() {
- var c = new Cookie();
- c.key = 'a'; c.value = 'b';
- c.maxAge = -1; // should be treated as "earliest representable"
- assert.equal(c.TTL(), 0);
- assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
- assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
- },
- "TTL with max-age and expires": function() {
- var c = new Cookie();
- c.maxAge = 123;
- c.expires = new Date(Date.now()+9000);
- assert.equal(c.TTL(), 123000);
- assert.ok(c.isPersistent());
- },
- "TTL with expires": function() {
- var c = new Cookie();
- var now = Date.now();
- c.expires = new Date(now+9000);
- assert.equal(c.TTL(now), 9000);
- assert.equal(c.expiryTime(), c.expires.getTime());
- },
- "TTL with old expires": function() {
- var c = new Cookie();
- c.setExpires('17 Oct 2010 00:00:00 GMT');
- assert.ok(c.TTL() < 0);
- assert.ok(c.isPersistent());
- },
- "default TTL": {
- topic: function() { return new Cookie(); },
- "is Infinite-future": function(c) { assert.equal(c.TTL(), Infinity) },
- "is a 'session' cookie": function(c) { assert.ok(!c.isPersistent()) },
- },
-}).addBatch({
- "Parsing": {
- "simple": {
- topic: function() {
- return Cookie.parse('a=bcd',true) || null;
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'a') },
- "value": function(c) { assert.equal(c.value, 'bcd') },
- "no path": function(c) { assert.equal(c.path, null) },
- "no domain": function(c) { assert.equal(c.domain, null) },
- "no extensions": function(c) { assert.ok(!c.extensions) },
- },
- "with expiry": {
- topic: function() {
- return Cookie.parse('a=bcd; Expires=Tue, 18 Oct 2011 07:05:03 GMT',true) || null;
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'a') },
- "value": function(c) { assert.equal(c.value, 'bcd') },
- "has expires": function(c) {
- assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
- assert.equal(c.expires.getTime(), 1318921503000);
- },
- },
- "with expiry and path": {
- topic: function() {
- return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc',true) || null;
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'abc') },
- "value": function(c) { assert.equal(c.value, 'xyzzy!') },
- "has expires": function(c) {
- assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
- assert.equal(c.expires.getTime(), 1318921503000);
- },
- "has path": function(c) { assert.equal(c.path, '/aBc'); },
- "no httponly or secure": function(c) {
- assert.ok(!c.httpOnly);
- assert.ok(!c.secure);
- },
- },
- "with everything": {
- topic: function() {
- return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc; Domain=example.com; Secure; HTTPOnly; Max-Age=1234; Foo=Bar; Baz', true) || null;
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'abc') },
- "value": function(c) { assert.equal(c.value, 'xyzzy!') },
- "has expires": function(c) {
- assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
- assert.equal(c.expires.getTime(), 1318921503000);
- },
- "has path": function(c) { assert.equal(c.path, '/aBc'); },
- "has domain": function(c) { assert.equal(c.domain, 'example.com'); },
- "has httponly": function(c) { assert.equal(c.httpOnly, true); },
- "has secure": function(c) { assert.equal(c.secure, true); },
- "has max-age": function(c) { assert.equal(c.maxAge, 1234); },
- "has extensions": function(c) {
- assert.ok(c.extensions);
- assert.equal(c.extensions[0], 'Foo=Bar');
- assert.equal(c.extensions[1], 'Baz');
- },
- },
- "invalid expires": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; Expires=xyzzy", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; Expires=xyzzy");
- assert.ok(c);
- assert.equal(c.expires, Infinity);
- },
- },
- "zero max-age": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; Max-Age=0", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; Max-Age=0");
- assert.ok(c);
- assert.equal(c.maxAge, 0);
- },
- },
- "negative max-age": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; Max-Age=-1", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; Max-Age=-1");
- assert.ok(c);
- assert.equal(c.maxAge, -1);
- },
- },
- "empty domain": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; domain=", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; domain=");
- assert.ok(c);
- assert.equal(c.domain, null);
- },
- },
- "dot domain": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; domain=.", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; domain=.");
- assert.ok(c);
- assert.equal(c.domain, null);
- },
- },
- "uppercase domain": {
- "strict lowercases": function() {
- var c = Cookie.parse("a=b; domain=EXAMPLE.COM");
- assert.ok(c);
- assert.equal(c.domain, 'example.com');
- },
- "non-strict lowercases": function() {
- var c = Cookie.parse("a=b; domain=EXAMPLE.COM");
- assert.ok(c);
- assert.equal(c.domain, 'example.com');
- },
- },
- "trailing dot in domain": {
- topic: function() {
- return Cookie.parse("a=b; Domain=example.com.", true) || null;
- },
- "has the domain": function(c) { assert.equal(c.domain,"example.com.") },
- "but doesn't validate": function(c) { assert.equal(c.validate(),false) },
- },
- "empty path": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; path=", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; path=");
- assert.ok(c);
- assert.equal(c.path, null);
- },
- },
- "no-slash path": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; path=xyzzy", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; path=xyzzy");
- assert.ok(c);
- assert.equal(c.path, null);
- },
- },
- "trailing semi-colons after path": {
- topic: function () {
- return [
- "a=b; path=/;",
- "c=d;;;;"
- ];
- },
- "strict": function (t) {
- assert.ok(!Cookie.parse(t[0], true));
- assert.ok(!Cookie.parse(t[1], true));
- },
- "non-strict": function (t) {
- var c1 = Cookie.parse(t[0]);
- var c2 = Cookie.parse(t[1]);
- assert.ok(c1);
- assert.ok(c2);
- assert.equal(c1.path, '/');
- }
- },
- "secure-with-value": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; Secure=xyzzy", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; Secure=xyzzy");
- assert.ok(c);
- assert.equal(c.secure, true);
- },
- },
- "httponly-with-value": {
- "strict": function() { assert.ok(!Cookie.parse("a=b; HttpOnly=xyzzy", true)) },
- "non-strict": function() {
- var c = Cookie.parse("a=b; HttpOnly=xyzzy");
- assert.ok(c);
- assert.equal(c.httpOnly, true);
- },
- },
- "garbage": {
- topic: function() {
- return Cookie.parse("\x08", true) || null;
- },
- "doesn't parse": function(c) { assert.equal(c,null) },
- },
- "public suffix domain": {
- topic: function() {
- return Cookie.parse("a=b; domain=kyoto.jp", true) || null;
- },
- "parses fine": function(c) {
- assert.ok(c);
- assert.equal(c.domain, 'kyoto.jp');
- },
- "but fails validation": function(c) {
- assert.ok(c);
- assert.ok(!c.validate());
- },
- },
- "Ironically, Google 'GAPS' cookie has very little whitespace": {
- topic: function() {
- return Cookie.parse("GAPS=1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-;Path=/;Expires=Thu, 17-Apr-2014 02:12:29 GMT;Secure;HttpOnly");
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'GAPS') },
- "value": function(c) { assert.equal(c.value, '1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-') },
- "path": function(c) {
- assert.notEqual(c.path, '/;Expires'); // BUG
- assert.equal(c.path, '/');
- },
- "expires": function(c) {
- assert.notEqual(c.expires, Infinity);
- assert.equal(c.expires.getTime(), 1397700749000);
- },
- "secure": function(c) { assert.ok(c.secure) },
- "httponly": function(c) { assert.ok(c.httpOnly) },
- },
- "lots of equal signs": {
- topic: function() {
- return Cookie.parse("queryPref=b=c&d=e; Path=/f=g; Expires=Thu, 17 Apr 2014 02:12:29 GMT; HttpOnly");
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'queryPref') },
- "value": function(c) { assert.equal(c.value, 'b=c&d=e') },
- "path": function(c) {
- assert.equal(c.path, '/f=g');
- },
- "expires": function(c) {
- assert.notEqual(c.expires, Infinity);
- assert.equal(c.expires.getTime(), 1397700749000);
- },
- "httponly": function(c) { assert.ok(c.httpOnly) },
- },
- "spaces in value": {
- "strict": {
- topic: function() {
- return Cookie.parse('a=one two three',true) || null;
- },
- "did not parse": function(c) { assert.isNull(c) },
- },
- "non-strict": {
- topic: function() {
- return Cookie.parse('a=one two three',false) || null;
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'a') },
- "value": function(c) { assert.equal(c.value, 'one two three') },
- "no path": function(c) { assert.equal(c.path, null) },
- "no domain": function(c) { assert.equal(c.domain, null) },
- "no extensions": function(c) { assert.ok(!c.extensions) },
- },
- },
- "quoted spaces in value": {
- "strict": {
- topic: function() {
- return Cookie.parse('a="one two three"',true) || null;
- },
- "did not parse": function(c) { assert.isNull(c) },
- },
- "non-strict": {
- topic: function() {
- return Cookie.parse('a="one two three"',false) || null;
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'a') },
- "value": function(c) { assert.equal(c.value, 'one two three') },
- "no path": function(c) { assert.equal(c.path, null) },
- "no domain": function(c) { assert.equal(c.domain, null) },
- "no extensions": function(c) { assert.ok(!c.extensions) },
- }
- },
- "non-ASCII in value": {
- "strict": {
- topic: function() {
- return Cookie.parse('farbe=weiß',true) || null;
- },
- "did not parse": function(c) { assert.isNull(c) },
- },
- "non-strict": {
- topic: function() {
- return Cookie.parse('farbe=weiß',false) || null;
- },
- "parsed": function(c) { assert.ok(c) },
- "key": function(c) { assert.equal(c.key, 'farbe') },
- "value": function(c) { assert.equal(c.value, 'weiß') },
- "no path": function(c) { assert.equal(c.path, null) },
- "no domain": function(c) { assert.equal(c.domain, null) },
- "no extensions": function(c) { assert.ok(!c.extensions) },
- },
- },
- }
-})
-.addBatch({
- "domain normalization": {
- "simple": function() {
- var c = new Cookie();
- c.domain = "EXAMPLE.com";
- assert.equal(c.canonicalizedDomain(), "example.com");
- },
- "extra dots": function() {
- var c = new Cookie();
- c.domain = ".EXAMPLE.com";
- assert.equal(c.cdomain(), "example.com");
- },
- "weird trailing dot": function() {
- var c = new Cookie();
- c.domain = "EXAMPLE.ca.";
- assert.equal(c.canonicalizedDomain(), "example.ca.");
- },
- "weird internal dots": function() {
- var c = new Cookie();
- c.domain = "EXAMPLE...ca.";
- assert.equal(c.canonicalizedDomain(), "example...ca.");
- },
- "IDN": function() {
- var c = new Cookie();
- c.domain = "δοκιμή.δοκιμή"; // "test.test" in greek
- assert.equal(c.canonicalizedDomain(), "xn--jxalpdlp.xn--jxalpdlp");
- }
- }
-})
-.addBatch({
- "Domain Match":matchVows(tough.domainMatch, [
- // str, dom, expect
- ["example.com", "example.com", true],
- ["eXaMpLe.cOm", "ExAmPlE.CoM", true],
- ["no.ca", "yes.ca", false],
- ["wwwexample.com", "example.com", false],
- ["www.example.com", "example.com", true],
- ["example.com", "www.example.com", false],
- ["www.subdom.example.com", "example.com", true],
- ["www.subdom.example.com", "subdom.example.com", true],
- ["example.com", "example.com.", false], // RFC6265 S4.1.2.3
- ["192.168.0.1", "168.0.1", false], // S5.1.3 "The string is a host name"
- [null, "example.com", null],
- ["example.com", null, null],
- [null, null, null],
- [undefined, undefined, null],
- ])
-})
-.addBatch({
- "default-path": defaultPathVows([
- [null,"/"],
- ["/","/"],
- ["/file","/"],
- ["/dir/file","/dir"],
- ["noslash","/"],
- ])
-})
-.addBatch({
- "Path-Match": matchVows(tough.pathMatch, [
- // request, cookie, match
- ["/","/",true],
- ["/dir","/",true],
- ["/","/dir",false],
- ["/dir/","/dir/", true],
- ["/dir/file","/dir/",true],
- ["/dir/file","/dir",true],
- ["/directory","/dir",false],
- ])
-})
-.addBatch({
- "Cookie Sorting": {
- topic: function() {
- var cookies = [];
- var now = Date.now();
- cookies.push(Cookie.parse("a=0; Domain=example.com"));
- cookies.push(Cookie.parse("b=1; Domain=www.example.com"));
- cookies.push(Cookie.parse("c=2; Domain=example.com; Path=/pathA"));
- cookies.push(Cookie.parse("d=3; Domain=www.example.com; Path=/pathA"));
- cookies.push(Cookie.parse("e=4; Domain=example.com; Path=/pathA/pathB"));
- cookies.push(Cookie.parse("f=5; Domain=www.example.com; Path=/pathA/pathB"));
-
- // force a stable creation time consistent with the order above since
- // some may have been created at now + 1ms.
- var i = cookies.length;
- cookies.forEach(function(cookie) {
- cookie.creation = new Date(now - 100*(i--));
- });
-
- // weak shuffle:
- cookies = cookies.sort(function(){return Math.random()-0.5});
-
- cookies = cookies.sort(tough.cookieCompare);
- return cookies;
- },
- "got": function(cookies) {
- assert.lengthOf(cookies, 6);
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['e','f','c','d','a','b']);
- },
- }
-})
-.addBatch({
- "CookieJar": {
- "Setting a basic cookie": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=example.com; Path=/");
- assert.strictEqual(c.hostOnly, null);
- assert.instanceOf(c.creation, Date);
- assert.strictEqual(c.lastAccessed, null);
- c.creation = new Date(Date.now()-10000);
- cj.setCookie(c, 'http://example.com/index.html', this.callback);
- },
- "works": function(c) { assert.instanceOf(c,Cookie) }, // C is for Cookie, good enough for me
- "gets timestamped": function(c) {
- assert.ok(c.creation);
- assert.ok(Date.now() - c.creation.getTime() < 5000); // recently stamped
- assert.ok(c.lastAccessed);
- assert.equal(c.creation, c.lastAccessed);
- assert.equal(c.TTL(), Infinity);
- assert.ok(!c.isPersistent());
- },
- },
- "Setting a no-path cookie": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=example.com");
- assert.strictEqual(c.hostOnly, null);
- assert.instanceOf(c.creation, Date);
- assert.strictEqual(c.lastAccessed, null);
- c.creation = new Date(Date.now()-10000);
- cj.setCookie(c, 'http://example.com/index.html', this.callback);
- },
- "domain": function(c) { assert.equal(c.domain, 'example.com') },
- "path is /": function(c) { assert.equal(c.path, '/') },
- "path was derived": function(c) { assert.strictEqual(c.pathIsDefault, true) },
- },
- "Setting a cookie already marked as host-only": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=example.com");
- assert.strictEqual(c.hostOnly, null);
- assert.instanceOf(c.creation, Date);
- assert.strictEqual(c.lastAccessed, null);
- c.creation = new Date(Date.now()-10000);
- c.hostOnly = true;
- cj.setCookie(c, 'http://example.com/index.html', this.callback);
- },
- "domain": function(c) { assert.equal(c.domain, 'example.com') },
- "still hostOnly": function(c) { assert.strictEqual(c.hostOnly, true) },
- },
- "Setting a session cookie": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b");
- assert.strictEqual(c.path, null);
- cj.setCookie(c, 'http://www.example.com/dir/index.html', this.callback);
- },
- "works": function(c) { assert.instanceOf(c,Cookie) },
- "gets the domain": function(c) { assert.equal(c.domain, 'www.example.com') },
- "gets the default path": function(c) { assert.equal(c.path, '/dir') },
- "is 'hostOnly'": function(c) { assert.ok(c.hostOnly) },
- },
- "Setting wrong domain cookie": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=fooxample.com; Path=/");
- cj.setCookie(c, 'http://example.com/index.html', this.callback);
- },
- "fails": function(err,c) {
- assert.ok(err.message.match(/domain/i));
- assert.ok(!c);
- },
- },
- "Setting sub-domain cookie": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=www.example.com; Path=/");
- cj.setCookie(c, 'http://example.com/index.html', this.callback);
- },
- "fails": function(err,c) {
- assert.ok(err.message.match(/domain/i));
- assert.ok(!c);
- },
- },
- "Setting super-domain cookie": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=example.com; Path=/");
- cj.setCookie(c, 'http://www.app.example.com/index.html', this.callback);
- },
- "success": function(err,c) {
- assert.ok(!err);
- assert.equal(c.domain, 'example.com');
- },
- },
- "Setting a sub-path cookie on a super-domain": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=example.com; Path=/subpath");
- assert.strictEqual(c.hostOnly, null);
- assert.instanceOf(c.creation, Date);
- assert.strictEqual(c.lastAccessed, null);
- c.creation = new Date(Date.now()-10000);
- cj.setCookie(c, 'http://www.example.com/index.html', this.callback);
- },
- "domain is super-domain": function(c) { assert.equal(c.domain, 'example.com') },
- "path is /subpath": function(c) { assert.equal(c.path, '/subpath') },
- "path was NOT derived": function(c) { assert.strictEqual(c.pathIsDefault, null) },
- },
- "Setting HttpOnly cookie over non-HTTP API": {
- topic: function() {
- var cj = new CookieJar();
- var c = Cookie.parse("a=b; Domain=example.com; Path=/; HttpOnly");
- cj.setCookie(c, 'http://example.com/index.html', {http:false}, this.callback);
- },
- "fails": function(err,c) {
- assert.match(err.message, /HttpOnly/i);
- assert.ok(!c);
- },
- },
- },
- "Cookie Jar store eight cookies": {
- topic: function() {
- var cj = new CookieJar();
- var ex = 'http://example.com/index.html';
- var tasks = [];
- tasks.push(function(next) {
- cj.setCookie('a=1; Domain=example.com; Path=/',ex,at(0),next);
- });
- tasks.push(function(next) {
- cj.setCookie('b=2; Domain=example.com; Path=/; HttpOnly',ex,at(1000),next);
- });
- tasks.push(function(next) {
- cj.setCookie('c=3; Domain=example.com; Path=/; Secure',ex,at(2000),next);
- });
- tasks.push(function(next) { // path
- cj.setCookie('d=4; Domain=example.com; Path=/foo',ex,at(3000),next);
- });
- tasks.push(function(next) { // host only
- cj.setCookie('e=5',ex,at(4000),next);
- });
- tasks.push(function(next) { // other domain
- cj.setCookie('f=6; Domain=nodejs.org; Path=/','http://nodejs.org',at(5000),next);
- });
- tasks.push(function(next) { // expired
- cj.setCookie('g=7; Domain=example.com; Path=/; Expires=Tue, 18 Oct 2011 00:00:00 GMT',ex,at(6000),next);
- });
- tasks.push(function(next) { // expired via Max-Age
- cj.setCookie('h=8; Domain=example.com; Path=/; Max-Age=1',ex,next);
- });
- var cb = this.callback;
- async.parallel(tasks, function(err,results){
- setTimeout(function() {
- cb(err,cj,results);
- }, 2000); // so that 'h=8' expires
- });
- },
- "setup ok": function(err,cj,results) {
- assert.ok(!err);
- assert.ok(cj);
- assert.ok(results);
- },
- "then retrieving for http://nodejs.org": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('http://nodejs.org',this.callback);
- },
- "get a nodejs cookie": function(cookies) {
- assert.lengthOf(cookies, 1);
- var cookie = cookies[0];
- assert.equal(cookie.domain, 'nodejs.org');
- },
- },
- "then retrieving for https://example.com": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('https://example.com',{secure:true},this.callback);
- },
- "get a secure example cookie with others": function(cookies) {
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['a','b','c','e']);
- },
- },
- "then retrieving for https://example.com (missing options)": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('https://example.com',this.callback);
- },
- "get a secure example cookie with others": function(cookies) {
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['a','b','c','e']);
- },
- },
- "then retrieving for http://example.com": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('http://example.com',this.callback);
- },
- "get a bunch of cookies": function(cookies) {
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['a','b','e']);
- },
- },
- "then retrieving for http://EXAMPlE.com": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('http://EXAMPlE.com',this.callback);
- },
- "get a bunch of cookies": function(cookies) {
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['a','b','e']);
- },
- },
- "then retrieving for http://example.com, non-HTTP": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('http://example.com',{http:false},this.callback);
- },
- "get a bunch of cookies": function(cookies) {
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['a','e']);
- },
- },
- "then retrieving for http://example.com/foo/bar": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('http://example.com/foo/bar',this.callback);
- },
- "get a bunch of cookies": function(cookies) {
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['d','a','b','e']);
- },
- },
- "then retrieving for http://example.com as a string": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookieString('http://example.com',this.callback);
- },
- "get a single string": function(cookieHeader) {
- assert.equal(cookieHeader, "a=1; b=2; e=5");
- },
- },
- "then retrieving for http://example.com as a set-cookie header": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getSetCookieStrings('http://example.com',this.callback);
- },
- "get a single string": function(cookieHeaders) {
- assert.lengthOf(cookieHeaders, 3);
- assert.equal(cookieHeaders[0], "a=1; Domain=example.com; Path=/");
- assert.equal(cookieHeaders[1], "b=2; Domain=example.com; Path=/; HttpOnly");
- assert.equal(cookieHeaders[2], "e=5; Path=/");
- },
- },
- "then retrieving for http://www.example.com/": {
- topic: function(cj,oldResults) {
- assert.ok(oldResults);
- cj.getCookies('http://www.example.com/foo/bar',this.callback);
- },
- "get a bunch of cookies": function(cookies) {
- var names = cookies.map(function(c) {return c.key});
- assert.deepEqual(names, ['d','a','b']); // note lack of 'e'
- },
- },
- },
- "Repeated names": {
- topic: function() {
- var cb = this.callback;
- var cj = new CookieJar();
- var ex = 'http://www.example.com/';
- var sc = cj.setCookie;
- var tasks = [];
- var now = Date.now();
- tasks.push(sc.bind(cj,'aaaa=xxxx',ex,at(0)));
- tasks.push(sc.bind(cj,'aaaa=1111; Domain=www.example.com',ex,at(1000)));
- tasks.push(sc.bind(cj,'aaaa=2222; Domain=example.com',ex,at(2000)));
- tasks.push(sc.bind(cj,'aaaa=3333; Domain=www.example.com; Path=/pathA',ex,at(3000)));
- async.series(tasks,function(err,results) {
- results = results.filter(function(e) {return e !== undefined});
- cb(err,{cj:cj, cookies:results, now:now});
- });
- },
- "all got set": function(err,t) {
- assert.lengthOf(t.cookies,4);
- },
- "then getting 'em back": {
- topic: function(t) {
- var cj = t.cj;
- cj.getCookies('http://www.example.com/pathA',this.callback);
- },
- "there's just three": function (err,cookies) {
- var vals = cookies.map(function(c) {return c.value});
- // may break with sorting; sorting should put 3333 first due to longest path:
- assert.deepEqual(vals, ['3333','1111','2222']);
- }
- },
- },
- "CookieJar setCookie errors": {
- "public-suffix domain": {
- topic: function() {
- var cj = new CookieJar();
- cj.setCookie('i=9; Domain=kyoto.jp; Path=/','kyoto.jp',this.callback);
- },
- "errors": function(err,cookie) {
- assert.ok(err);
- assert.ok(!cookie);
- assert.match(err.message, /public suffix/i);
- },
- },
- "wrong domain": {
- topic: function() {
- var cj = new CookieJar();
- cj.setCookie('j=10; Domain=google.com; Path=/','google.ca',this.callback);
- },
- "errors": function(err,cookie) {
- assert.ok(err);
- assert.ok(!cookie);
- assert.match(err.message, /not in this host's domain/i);
- },
- },
- "old cookie is HttpOnly": {
- topic: function() {
- var cb = this.callback;
- var next = function (err,c) {
- c = null;
- return cb(err,cj);
- };
- var cj = new CookieJar();
- cj.setCookie('k=11; Domain=example.ca; Path=/; HttpOnly','http://example.ca',{http:true},next);
- },
- "initial cookie is set": function(err,cj) {
- assert.ok(!err);
- assert.ok(cj);
- },
- "but when trying to overwrite": {
- topic: function(cj) {
- var cb = this.callback;
- var next = function(err,c) {
- c = null;
- cb(null,err);
- };
- cj.setCookie('k=12; Domain=example.ca; Path=/','http://example.ca',{http:false},next);
- },
- "it's an error": function(err) {
- assert.ok(err);
- },
- "then, checking the original": {
- topic: function(ignored,cj) {
- assert.ok(cj instanceof CookieJar);
- cj.getCookies('http://example.ca',{http:true},this.callback);
- },
- "cookie has original value": function(err,cookies) {
- assert.equal(err,null);
- assert.lengthOf(cookies, 1);
- assert.equal(cookies[0].value,11);
- },
- },
- },
- },
- },
-})
-.addBatch({
- "JSON": {
- "serialization": {
- topic: function() {
- var c = Cookie.parse('alpha=beta; Domain=example.com; Path=/foo; Expires=Tue, 19 Jan 2038 03:14:07 GMT; HttpOnly');
- return JSON.stringify(c);
- },
- "gives a string": function(str) {
- assert.equal(typeof str, "string");
- },
- "date is in ISO format": function(str) {
- assert.match(str, /"expires":"2038-01-19T03:14:07\.000Z"/, 'expires is in ISO format');
- },
- },
- "deserialization": {
- topic: function() {
- var json = '{"key":"alpha","value":"beta","domain":"example.com","path":"/foo","expires":"2038-01-19T03:14:07.000Z","httpOnly":true,"lastAccessed":2000000000123}';
- return Cookie.fromJSON(json);
- },
- "works": function(c) {
- assert.ok(c);
- },
- "key": function(c) { assert.equal(c.key, "alpha") },
- "value": function(c) { assert.equal(c.value, "beta") },
- "domain": function(c) { assert.equal(c.domain, "example.com") },
- "path": function(c) { assert.equal(c.path, "/foo") },
- "httpOnly": function(c) { assert.strictEqual(c.httpOnly, true) },
- "secure": function(c) { assert.strictEqual(c.secure, false) },
- "hostOnly": function(c) { assert.strictEqual(c.hostOnly, null) },
- "expires is a date object": function(c) {
- assert.equal(c.expires.getTime(), 2147483647000);
- },
- "lastAccessed is a date object": function(c) {
- assert.equal(c.lastAccessed.getTime(), 2000000000123);
- },
- "creation defaulted": function(c) {
- assert.ok(c.creation.getTime());
- }
- },
- "null deserialization": {
- topic: function() {
- return Cookie.fromJSON(null);
- },
- "is null": function(cookie) {
- assert.equal(cookie,null);
- },
- },
- },
- "expiry deserialization": {
- "Infinity": {
- topic: Cookie.fromJSON.bind(null, '{"expires":"Infinity"}'),
- "is infinite": function(c) {
- assert.strictEqual(c.expires, "Infinity");
- assert.equal(c.expires, Infinity);
- },
- },
- },
- "maxAge serialization": {
- topic: function() {
- return function(toSet) {
- var c = new Cookie();
- c.key = 'foo'; c.value = 'bar';
- c.setMaxAge(toSet);
- return JSON.stringify(c);
- };
- },
- "zero": {
- topic: function(f) { return f(0) },
- "looks good": function(str) {
- assert.match(str, /"maxAge":0/);
- },
- },
- "Infinity": {
- topic: function(f) { return f(Infinity) },
- "looks good": function(str) {
- assert.match(str, /"maxAge":"Infinity"/);
- },
- },
- "-Infinity": {
- topic: function(f) { return f(-Infinity) },
- "looks good": function(str) {
- assert.match(str, /"maxAge":"-Infinity"/);
- },
- },
- "null": {
- topic: function(f) { return f(null) },
- "looks good": function(str) {
- assert.match(str, /"maxAge":null/);
- },
- },
- },
- "maxAge deserialization": {
- "number": {
- topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":123}'),
- "is the number": function(c) {
- assert.strictEqual(c.maxAge, 123);
- },
- },
- "null": {
- topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":null}'),
- "is null": function(c) {
- assert.strictEqual(c.maxAge, null);
- },
- },
- "less than zero": {
- topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":-123}'),
- "is -123": function(c) {
- assert.strictEqual(c.maxAge, -123);
- },
- },
- "Infinity": {
- topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"Infinity"}'),
- "is inf-as-string": function(c) {
- assert.strictEqual(c.maxAge, "Infinity");
- },
- },
- "-Infinity": {
- topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"-Infinity"}'),
- "is inf-as-string": function(c) {
- assert.strictEqual(c.maxAge, "-Infinity");
- },
- },
- }
-})
-.addBatch({
- "permuteDomain": {
- "base case": {
- topic: tough.permuteDomain.bind(null,'example.com'),
- "got the domain": function(list) {
- assert.deepEqual(list, ['example.com']);
- },
- },
- "two levels": {
- topic: tough.permuteDomain.bind(null,'foo.bar.example.com'),
- "got three things": function(list) {
- assert.deepEqual(list, ['example.com','bar.example.com','foo.bar.example.com']);
- },
- },
- "invalid domain": {
- topic: tough.permuteDomain.bind(null,'foo.bar.example.localduhmain'),
- "got three things": function(list) {
- assert.equal(list, null);
- },
- },
- },
- "permutePath": {
- "base case": {
- topic: tough.permutePath.bind(null,'/'),
- "just slash": function(list) {
- assert.deepEqual(list,['/']);
- },
- },
- "single case": {
- topic: tough.permutePath.bind(null,'/foo'),
- "two things": function(list) {
- assert.deepEqual(list,['/foo','/']);
- },
- "path matching": function(list) {
- list.forEach(function(e) {
- assert.ok(tough.pathMatch('/foo',e));
- });
- },
- },
- "double case": {
- topic: tough.permutePath.bind(null,'/foo/bar'),
- "four things": function(list) {
- assert.deepEqual(list,['/foo/bar','/foo','/']);
- },
- "path matching": function(list) {
- list.forEach(function(e) {
- assert.ok(tough.pathMatch('/foo/bar',e));
- });
- },
- },
- "trailing slash": {
- topic: tough.permutePath.bind(null,'/foo/bar/'),
- "three things": function(list) {
- assert.deepEqual(list,['/foo/bar','/foo','/']);
- },
- "path matching": function(list) {
- list.forEach(function(e) {
- assert.ok(tough.pathMatch('/foo/bar/',e));
- });
- },
- },
- }
-})
-.addBatch({
- "Issue 1": {
- topic: function() {
- var cj = new CookieJar();
- cj.setCookie('hello=world; path=/some/path/', 'http://domain/some/path/file', function(err,cookie) {
- this.callback(err,{cj:cj, cookie:cookie});
- }.bind(this));
- },
- "stored a cookie": function(t) {
- assert.ok(t.cookie);
- },
- "cookie's path was modified to remove unnecessary slash": function(t) {
- assert.equal(t.cookie.path, '/some/path');
- },
- "getting it back": {
- topic: function(t) {
- t.cj.getCookies('http://domain/some/path/file', function(err,cookies) {
- this.callback(err, {cj:t.cj, cookies:cookies||[]});
- }.bind(this));
- },
- "got one cookie": function(t) {
- assert.lengthOf(t.cookies, 1);
- },
- "it's the right one": function(t) {
- var c = t.cookies[0];
- assert.equal(c.key, 'hello');
- assert.equal(c.value, 'world');
- },
- }
- }
-})
-.addBatch({
- "expiry option": {
- topic: function() {
- var cb = this.callback;
- var cj = new CookieJar();
- cj.setCookie('near=expiry; Domain=example.com; Path=/; Max-Age=1','http://www.example.com',at(-1), function(err,cookie) {
-
- cb(err, {cj:cj, cookie:cookie});
- });
- },
- "set the cookie": function(t) {
- assert.ok(t.cookie, "didn't set?!");
- assert.equal(t.cookie.key, 'near');
- },
- "then, retrieving": {
- topic: function(t) {
- var cb = this.callback;
- setTimeout(function() {
- t.cj.getCookies('http://www.example.com', {http:true, expire:false}, function(err,cookies) {
- t.cookies = cookies;
- cb(err,t);
- });
- },2000);
- },
- "got the cookie": function(t) {
- assert.lengthOf(t.cookies, 1);
- assert.equal(t.cookies[0].key, 'near');
- },
- }
- }
-})
-.addBatch({
- "trailing semi-colon set into cj": {
- topic: function () {
- var cb = this.callback;
- var cj = new CookieJar();
- var ex = 'http://www.example.com';
- var tasks = [];
- tasks.push(function(next) {
- cj.setCookie('broken_path=testme; path=/;',ex,at(-1),next);
- });
- tasks.push(function(next) {
- cj.setCookie('b=2; Path=/;;;;',ex,at(-1),next);
- });
- async.parallel(tasks, function (err, cookies) {
- cb(null, {
- cj: cj,
- cookies: cookies
- });
- });
- },
- "check number of cookies": function (t) {
- assert.lengthOf(t.cookies, 2, "didn't set");
- },
- "check *broken_path* was set properly": function (t) {
- assert.equal(t.cookies[0].key, "broken_path");
- assert.equal(t.cookies[0].value, "testme");
- assert.equal(t.cookies[0].path, "/");
- },
- "check *b* was set properly": function (t) {
- assert.equal(t.cookies[1].key, "b");
- assert.equal(t.cookies[1].value, "2");
- assert.equal(t.cookies[1].path, "/");
- },
- "retrieve the cookie": {
- topic: function (t) {
- var cb = this.callback;
- t.cj.getCookies('http://www.example.com', {}, function (err, cookies) {
- t.cookies = cookies;
- cb(err, t);
- });
- },
- "get the cookie": function(t) {
- assert.lengthOf(t.cookies, 2);
- assert.equal(t.cookies[0].key, 'broken_path');
- assert.equal(t.cookies[0].value, 'testme');
- assert.equal(t.cookies[1].key, "b");
- assert.equal(t.cookies[1].value, "2");
- assert.equal(t.cookies[1].path, "/");
- },
- },
- }
-})
-.addBatch({
- "Constructor":{
- topic: function () {
- return new Cookie({
- key: 'test',
- value: 'b',
- maxAge: 60
- });
- },
- 'check for key property': function (c) {
- assert.ok(c);
- assert.equal(c.key, 'test');
- },
- 'check for value property': function (c) {
- assert.equal(c.value, 'b');
- },
- 'check for maxAge': function (c) {
- assert.equal(c.maxAge, 60);
- },
- 'check for default values for unspecified properties': function (c) {
- assert.equal(c.expires, "Infinity");
- assert.equal(c.secure, false);
- assert.equal(c.httpOnly, false);
- }
- }
-})
-.addBatch({
- "allPaths option": {
- topic: function() {
- var cj = new CookieJar();
- var tasks = [];
- tasks.push(cj.setCookie.bind(cj, 'nopath_dom=qq; Path=/; Domain=example.com', 'http://example.com', {}));
- tasks.push(cj.setCookie.bind(cj, 'path_dom=qq; Path=/foo; Domain=example.com', 'http://example.com', {}));
- tasks.push(cj.setCookie.bind(cj, 'nopath_host=qq; Path=/', 'http://www.example.com', {}));
- tasks.push(cj.setCookie.bind(cj, 'path_host=qq; Path=/foo', 'http://www.example.com', {}));
- tasks.push(cj.setCookie.bind(cj, 'other=qq; Path=/', 'http://other.example.com/', {}));
- tasks.push(cj.setCookie.bind(cj, 'other2=qq; Path=/foo', 'http://other.example.com/foo', {}));
- var cb = this.callback;
- async.parallel(tasks, function(err,results) {
- cb(err, {cj:cj, cookies: results});
- });
- },
- "all set": function(t) {
- assert.equal(t.cookies.length, 6);
- assert.ok(t.cookies.every(function(c) { return !!c }));
- },
- "getting without allPaths": {
- topic: function(t) {
- var cb = this.callback;
- var cj = t.cj;
- cj.getCookies('http://www.example.com/', {}, function(err,cookies) {
- cb(err, {cj:cj, cookies:cookies});
- });
- },
- "found just two cookies": function(t) {
- assert.equal(t.cookies.length, 2);
- },
- "all are path=/": function(t) {
- assert.ok(t.cookies.every(function(c) { return c.path === '/' }));
- },
- "no 'other' cookies": function(t) {
- assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) }));
- },
- },
- "getting without allPaths for /foo": {
- topic: function(t) {
- var cb = this.callback;
- var cj = t.cj;
- cj.getCookies('http://www.example.com/foo', {}, function(err,cookies) {
- cb(err, {cj:cj, cookies:cookies});
- });
- },
- "found four cookies": function(t) {
- assert.equal(t.cookies.length, 4);
- },
- "no 'other' cookies": function(t) {
- assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) }));
- },
- },
- "getting with allPaths:true": {
- topic: function(t) {
- var cb = this.callback;
- var cj = t.cj;
- cj.getCookies('http://www.example.com/', {allPaths:true}, function(err,cookies) {
- cb(err, {cj:cj, cookies:cookies});
- });
- },
- "found four cookies": function(t) {
- assert.equal(t.cookies.length, 4);
- },
- "no 'other' cookies": function(t) {
- assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) }));
- },
- },
- }
-})
-.addBatch({
- "remove cookies": {
- topic: function() {
- var jar = new CookieJar();
- var cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
- var cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/");
- var cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/");
- jar.setCookie(cookie, 'http://example.com/index.html', function(){});
- jar.setCookie(cookie2, 'http://foo.com/index.html', function(){});
- jar.setCookie(cookie3, 'http://foo.com/index.html', function(){});
- return jar;
- },
- "all from matching domain": function(jar){
- jar.store.removeCookies('example.com',null, function(err) {
- assert(err == null);
-
- jar.store.findCookies('example.com', null, function(err, cookies){
- assert(err == null);
- assert(cookies != null);
- assert(cookies.length === 0, 'cookie was not removed');
- });
-
- jar.store.findCookies('foo.com', null, function(err, cookies){
- assert(err == null);
- assert(cookies != null);
- assert(cookies.length === 2, 'cookies should not have been removed');
- });
- });
- },
- "from cookie store matching domain and key": function(jar){
- jar.store.removeCookie('foo.com', '/', 'foo', function(err) {
- assert(err == null);
-
- jar.store.findCookies('foo.com', null, function(err, cookies){
- assert(err == null);
- assert(cookies != null);
- assert(cookies.length === 1, 'cookie was not removed correctly');
- assert(cookies[0].key === 'a', 'wrong cookie was removed');
- });
- });
- }
- }
-})
-.addBatch({
- "Synchronous CookieJar": {
- "setCookieSync": {
- topic: function() {
- var jar = new CookieJar();
- var cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
- cookie = jar.setCookieSync(cookie, 'http://example.com/index.html');
- return cookie;
- },
- "returns a copy of the cookie": function(cookie) {
- assert.instanceOf(cookie, Cookie);
- }
- },
-
- "setCookieSync strict parse error": {
- topic: function() {
- var jar = new CookieJar();
- var opts = { strict: true };
- try {
- jar.setCookieSync("farbe=weiß", 'http://example.com/index.html', opts);
- return false;
- } catch (e) {
- return e;
- }
- },
- "throws the error": function(err) {
- assert.instanceOf(err, Error);
- assert.equal(err.message, "Cookie failed to parse");
- }
- },
-
- "getCookiesSync": {
- topic: function() {
- var jar = new CookieJar();
- var url = 'http://example.com/index.html';
- jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
- jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
- return jar.getCookiesSync(url);
- },
- "returns the cookie array": function(err, cookies) {
- assert.ok(!err);
- assert.ok(Array.isArray(cookies));
- assert.lengthOf(cookies, 2);
- cookies.forEach(function(cookie) {
- assert.instanceOf(cookie, Cookie);
- });
- }
- },
-
- "getCookieStringSync": {
- topic: function() {
- var jar = new CookieJar();
- var url = 'http://example.com/index.html';
- jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
- jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
- return jar.getCookieStringSync(url);
- },
- "returns the cookie header string": function(err, str) {
- assert.ok(!err);
- assert.typeOf(str, 'string');
- }
- },
-
- "getSetCookieStringsSync": {
- topic: function() {
- var jar = new CookieJar();
- var url = 'http://example.com/index.html';
- jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
- jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
- return jar.getSetCookieStringsSync(url);
- },
- "returns the cookie header string": function(err, headers) {
- assert.ok(!err);
- assert.ok(Array.isArray(headers));
- assert.lengthOf(headers, 2);
- headers.forEach(function(header) {
- assert.typeOf(header, 'string');
- });
- }
- },
- }
-})
-.addBatch({
- "Synchronous API on async CookieJar": {
- topic: function() {
- return new tough.Store();
- },
- "setCookieSync": {
- topic: function(store) {
- var jar = new CookieJar(store);
- try {
- jar.setCookieSync("a=b", 'http://example.com/index.html');
- return false;
- } catch(e) {
- return e;
- }
- },
- "fails": function(err) {
- assert.instanceOf(err, Error);
- assert.equal(err.message,
- 'CookieJar store is not synchronous; use async API instead.');
- }
- },
- "getCookiesSync": {
- topic: function(store) {
- var jar = new CookieJar(store);
- try {
- jar.getCookiesSync('http://example.com/index.html');
- return false;
- } catch(e) {
- return e;
- }
- },
- "fails": function(err) {
- assert.instanceOf(err, Error);
- assert.equal(err.message,
- 'CookieJar store is not synchronous; use async API instead.');
- }
- },
- "getCookieStringSync": {
- topic: function(store) {
- var jar = new CookieJar(store);
- try {
- jar.getCookieStringSync('http://example.com/index.html');
- return false;
- } catch(e) {
- return e;
- }
- },
- "fails": function(err) {
- assert.instanceOf(err, Error);
- assert.equal(err.message,
- 'CookieJar store is not synchronous; use async API instead.');
- }
- },
- "getSetCookieStringsSync": {
- topic: function(store) {
- var jar = new CookieJar(store);
- try {
- jar.getSetCookieStringsSync('http://example.com/index.html');
- return false;
- } catch(e) {
- return e;
- }
- },
- "fails": function(err) {
- assert.instanceOf(err, Error);
- assert.equal(err.message,
- 'CookieJar store is not synchronous; use async API instead.');
- }
- },
- }
-})
-.export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/api_test.js b/node_modules/request/node_modules/tough-cookie/test/api_test.js
new file mode 100644
index 000000000..b21326cdf
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/api_test.js
@@ -0,0 +1,372 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var async = require('async');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+var CookieJar = tough.CookieJar;
+
+
+var atNow = Date.now();
+
+function at(offset) {
+ return {now: new Date(atNow + offset)};
+}
+
+vows
+ .describe('API')
+ .addBatch({
+ "All defined": function () {
+ assert.ok(Cookie);
+ assert.ok(CookieJar);
+ }
+ })
+ .addBatch({
+ "Constructor": {
+ topic: function () {
+ return new Cookie({
+ key: 'test',
+ value: 'b',
+ maxAge: 60
+ });
+ },
+ 'check for key property': function (c) {
+ assert.ok(c);
+ assert.equal(c.key, 'test');
+ },
+ 'check for value property': function (c) {
+ assert.equal(c.value, 'b');
+ },
+ 'check for maxAge': function (c) {
+ assert.equal(c.maxAge, 60);
+ },
+ 'check for default values for unspecified properties': function (c) {
+ assert.equal(c.expires, "Infinity");
+ assert.equal(c.secure, false);
+ assert.equal(c.httpOnly, false);
+ }
+ }
+ })
+ .addBatch({
+ "expiry option": {
+ topic: function () {
+ var cb = this.callback;
+ var cj = new CookieJar();
+ cj.setCookie('near=expiry; Domain=example.com; Path=/; Max-Age=1', 'http://www.example.com', at(-1), function (err, cookie) {
+
+ cb(err, {cj: cj, cookie: cookie});
+ });
+ },
+ "set the cookie": function (t) {
+ assert.ok(t.cookie, "didn't set?!");
+ assert.equal(t.cookie.key, 'near');
+ },
+ "then, retrieving": {
+ topic: function (t) {
+ var cb = this.callback;
+ setTimeout(function () {
+ t.cj.getCookies('http://www.example.com', {http: true, expire: false}, function (err, cookies) {
+ t.cookies = cookies;
+ cb(err, t);
+ });
+ }, 2000);
+ },
+ "got the cookie": function (t) {
+ assert.lengthOf(t.cookies, 1);
+ assert.equal(t.cookies[0].key, 'near');
+ }
+ }
+ }
+ })
+ .addBatch({
+ "allPaths option": {
+ topic: function () {
+ var cj = new CookieJar();
+ var tasks = [];
+ tasks.push(cj.setCookie.bind(cj, 'nopath_dom=qq; Path=/; Domain=example.com', 'http://example.com', {}));
+ tasks.push(cj.setCookie.bind(cj, 'path_dom=qq; Path=/foo; Domain=example.com', 'http://example.com', {}));
+ tasks.push(cj.setCookie.bind(cj, 'nopath_host=qq; Path=/', 'http://www.example.com', {}));
+ tasks.push(cj.setCookie.bind(cj, 'path_host=qq; Path=/foo', 'http://www.example.com', {}));
+ tasks.push(cj.setCookie.bind(cj, 'other=qq; Path=/', 'http://other.example.com/', {}));
+ tasks.push(cj.setCookie.bind(cj, 'other2=qq; Path=/foo', 'http://other.example.com/foo', {}));
+ var cb = this.callback;
+ async.parallel(tasks, function (err, results) {
+ cb(err, {cj: cj, cookies: results});
+ });
+ },
+ "all set": function (t) {
+ assert.equal(t.cookies.length, 6);
+ assert.ok(t.cookies.every(function (c) {
+ return !!c
+ }));
+ },
+ "getting without allPaths": {
+ topic: function (t) {
+ var cb = this.callback;
+ var cj = t.cj;
+ cj.getCookies('http://www.example.com/', {}, function (err, cookies) {
+ cb(err, {cj: cj, cookies: cookies});
+ });
+ },
+ "found just two cookies": function (t) {
+ assert.equal(t.cookies.length, 2);
+ },
+ "all are path=/": function (t) {
+ assert.ok(t.cookies.every(function (c) {
+ return c.path === '/'
+ }));
+ },
+ "no 'other' cookies": function (t) {
+ assert.ok(!t.cookies.some(function (c) {
+ return (/^other/).test(c.name)
+ }));
+ }
+ },
+ "getting without allPaths for /foo": {
+ topic: function (t) {
+ var cb = this.callback;
+ var cj = t.cj;
+ cj.getCookies('http://www.example.com/foo', {}, function (err, cookies) {
+ cb(err, {cj: cj, cookies: cookies});
+ });
+ },
+ "found four cookies": function (t) {
+ assert.equal(t.cookies.length, 4);
+ },
+ "no 'other' cookies": function (t) {
+ assert.ok(!t.cookies.some(function (c) {
+ return (/^other/).test(c.name)
+ }));
+ }
+ },
+ "getting with allPaths:true": {
+ topic: function (t) {
+ var cb = this.callback;
+ var cj = t.cj;
+ cj.getCookies('http://www.example.com/', {allPaths: true}, function (err, cookies) {
+ cb(err, {cj: cj, cookies: cookies});
+ });
+ },
+ "found four cookies": function (t) {
+ assert.equal(t.cookies.length, 4);
+ },
+ "no 'other' cookies": function (t) {
+ assert.ok(!t.cookies.some(function (c) {
+ return (/^other/).test(c.name)
+ }));
+ }
+ }
+ }
+ })
+ .addBatch({
+ "Remove cookies": {
+ topic: function () {
+ var jar = new CookieJar();
+ var cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
+ var cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/");
+ var cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/");
+ jar.setCookie(cookie, 'http://example.com/index.html', function () {
+ });
+ jar.setCookie(cookie2, 'http://foo.com/index.html', function () {
+ });
+ jar.setCookie(cookie3, 'http://foo.com/index.html', function () {
+ });
+ return jar;
+ },
+ "all from matching domain": function (jar) {
+ jar.store.removeCookies('example.com', null, function (err) {
+ assert(err == null);
+
+ jar.store.findCookies('example.com', null, function (err, cookies) {
+ assert(err == null);
+ assert(cookies != null);
+ assert(cookies.length === 0, 'cookie was not removed');
+ });
+
+ jar.store.findCookies('foo.com', null, function (err, cookies) {
+ assert(err == null);
+ assert(cookies != null);
+ assert(cookies.length === 2, 'cookies should not have been removed');
+ });
+ });
+ },
+ "from cookie store matching domain and key": function (jar) {
+ jar.store.removeCookie('foo.com', '/', 'foo', function (err) {
+ assert(err == null);
+
+ jar.store.findCookies('foo.com', null, function (err, cookies) {
+ assert(err == null);
+ assert(cookies != null);
+ assert(cookies.length === 1, 'cookie was not removed correctly');
+ assert(cookies[0].key === 'a', 'wrong cookie was removed');
+ });
+ });
+ }
+ }
+ })
+ .addBatch({
+ "Synchronous CookieJar": {
+ "setCookieSync": {
+ topic: function () {
+ var jar = new CookieJar();
+ var cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
+ cookie = jar.setCookieSync(cookie, 'http://example.com/index.html');
+ return cookie;
+ },
+ "returns a copy of the cookie": function (cookie) {
+ assert.instanceOf(cookie, Cookie);
+ }
+ },
+ "getCookiesSync": {
+ topic: function () {
+ var jar = new CookieJar();
+ var url = 'http://example.com/index.html';
+ jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
+ jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
+ return jar.getCookiesSync(url);
+ },
+ "returns the cookie array": function (err, cookies) {
+ assert.ok(!err);
+ assert.ok(Array.isArray(cookies));
+ assert.lengthOf(cookies, 2);
+ cookies.forEach(function (cookie) {
+ assert.instanceOf(cookie, Cookie);
+ });
+ }
+ },
+
+ "getCookieStringSync": {
+ topic: function () {
+ var jar = new CookieJar();
+ var url = 'http://example.com/index.html';
+ jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
+ jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
+ return jar.getCookieStringSync(url);
+ },
+ "returns the cookie header string": function (err, str) {
+ assert.ok(!err);
+ assert.typeOf(str, 'string');
+ }
+ },
+
+ "getSetCookieStringsSync": {
+ topic: function () {
+ var jar = new CookieJar();
+ var url = 'http://example.com/index.html';
+ jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
+ jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
+ return jar.getSetCookieStringsSync(url);
+ },
+ "returns the cookie header string": function (err, headers) {
+ assert.ok(!err);
+ assert.ok(Array.isArray(headers));
+ assert.lengthOf(headers, 2);
+ headers.forEach(function (header) {
+ assert.typeOf(header, 'string');
+ });
+ }
+ }
+ }
+ })
+ .addBatch({
+ "Synchronous API on async CookieJar": {
+ topic: function () {
+ return new tough.Store();
+ },
+ "setCookieSync": {
+ topic: function (store) {
+ var jar = new CookieJar(store);
+ try {
+ jar.setCookieSync("a=b", 'http://example.com/index.html');
+ return false;
+ } catch (e) {
+ return e;
+ }
+ },
+ "fails": function (err) {
+ assert.instanceOf(err, Error);
+ assert.equal(err.message,
+ 'CookieJar store is not synchronous; use async API instead.');
+ }
+ },
+ "getCookiesSync": {
+ topic: function (store) {
+ var jar = new CookieJar(store);
+ try {
+ jar.getCookiesSync('http://example.com/index.html');
+ return false;
+ } catch (e) {
+ return e;
+ }
+ },
+ "fails": function (err) {
+ assert.instanceOf(err, Error);
+ assert.equal(err.message,
+ 'CookieJar store is not synchronous; use async API instead.');
+ }
+ },
+ "getCookieStringSync": {
+ topic: function (store) {
+ var jar = new CookieJar(store);
+ try {
+ jar.getCookieStringSync('http://example.com/index.html');
+ return false;
+ } catch (e) {
+ return e;
+ }
+ },
+ "fails": function (err) {
+ assert.instanceOf(err, Error);
+ assert.equal(err.message,
+ 'CookieJar store is not synchronous; use async API instead.');
+ }
+ },
+ "getSetCookieStringsSync": {
+ topic: function (store) {
+ var jar = new CookieJar(store);
+ try {
+ jar.getSetCookieStringsSync('http://example.com/index.html');
+ return false;
+ } catch (e) {
+ return e;
+ }
+ },
+ "fails": function (err) {
+ assert.instanceOf(err, Error);
+ assert.equal(err.message,
+ 'CookieJar store is not synchronous; use async API instead.');
+ }
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js b/node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js
new file mode 100644
index 000000000..689407b0b
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js
@@ -0,0 +1,468 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var async = require('async');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+var CookieJar = tough.CookieJar;
+
+var atNow = Date.now();
+
+function at(offset) {
+ return {now: new Date(atNow + offset)};
+}
+
+vows
+ .describe('CookieJar')
+ .addBatch({
+ "Setting a basic cookie": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=example.com; Path=/");
+ assert.strictEqual(c.hostOnly, null);
+ assert.instanceOf(c.creation, Date);
+ assert.strictEqual(c.lastAccessed, null);
+ c.creation = new Date(Date.now() - 10000);
+ cj.setCookie(c, 'http://example.com/index.html', this.callback);
+ },
+ "works": function (c) {
+ assert.instanceOf(c, Cookie)
+ }, // C is for Cookie, good enough for me
+ "gets timestamped": function (c) {
+ assert.ok(c.creation);
+ assert.ok(Date.now() - c.creation.getTime() < 5000); // recently stamped
+ assert.ok(c.lastAccessed);
+ assert.equal(c.creation, c.lastAccessed);
+ assert.equal(c.TTL(), Infinity);
+ assert.ok(!c.isPersistent());
+ }
+ },
+ "Setting a no-path cookie": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=example.com");
+ assert.strictEqual(c.hostOnly, null);
+ assert.instanceOf(c.creation, Date);
+ assert.strictEqual(c.lastAccessed, null);
+ c.creation = new Date(Date.now() - 10000);
+ cj.setCookie(c, 'http://example.com/index.html', this.callback);
+ },
+ "domain": function (c) {
+ assert.equal(c.domain, 'example.com')
+ },
+ "path is /": function (c) {
+ assert.equal(c.path, '/')
+ },
+ "path was derived": function (c) {
+ assert.strictEqual(c.pathIsDefault, true)
+ }
+ },
+ "Setting a cookie already marked as host-only": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=example.com");
+ assert.strictEqual(c.hostOnly, null);
+ assert.instanceOf(c.creation, Date);
+ assert.strictEqual(c.lastAccessed, null);
+ c.creation = new Date(Date.now() - 10000);
+ c.hostOnly = true;
+ cj.setCookie(c, 'http://example.com/index.html', this.callback);
+ },
+ "domain": function (c) {
+ assert.equal(c.domain, 'example.com')
+ },
+ "still hostOnly": function (c) {
+ assert.strictEqual(c.hostOnly, true)
+ }
+ },
+ "Setting a session cookie": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b");
+ assert.strictEqual(c.path, null);
+ cj.setCookie(c, 'http://www.example.com/dir/index.html', this.callback);
+ },
+ "works": function (c) {
+ assert.instanceOf(c, Cookie)
+ },
+ "gets the domain": function (c) {
+ assert.equal(c.domain, 'www.example.com')
+ },
+ "gets the default path": function (c) {
+ assert.equal(c.path, '/dir')
+ },
+ "is 'hostOnly'": function (c) {
+ assert.ok(c.hostOnly)
+ }
+ },
+ "Setting wrong domain cookie": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=fooxample.com; Path=/");
+ cj.setCookie(c, 'http://example.com/index.html', this.callback);
+ },
+ "fails": function (err, c) {
+ assert.ok(err.message.match(/domain/i));
+ assert.ok(!c);
+ }
+ },
+ "Setting sub-domain cookie": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=www.example.com; Path=/");
+ cj.setCookie(c, 'http://example.com/index.html', this.callback);
+ },
+ "fails": function (err, c) {
+ assert.ok(err.message.match(/domain/i));
+ assert.ok(!c);
+ }
+ },
+ "Setting super-domain cookie": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=example.com; Path=/");
+ cj.setCookie(c, 'http://www.app.example.com/index.html', this.callback);
+ },
+ "success": function (err, c) {
+ assert.ok(!err);
+ assert.equal(c.domain, 'example.com');
+ }
+ },
+ "Setting a sub-path cookie on a super-domain": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=example.com; Path=/subpath");
+ assert.strictEqual(c.hostOnly, null);
+ assert.instanceOf(c.creation, Date);
+ assert.strictEqual(c.lastAccessed, null);
+ c.creation = new Date(Date.now() - 10000);
+ cj.setCookie(c, 'http://www.example.com/index.html', this.callback);
+ },
+ "domain is super-domain": function (c) {
+ assert.equal(c.domain, 'example.com')
+ },
+ "path is /subpath": function (c) {
+ assert.equal(c.path, '/subpath')
+ },
+ "path was NOT derived": function (c) {
+ assert.strictEqual(c.pathIsDefault, null)
+ }
+ },
+ "Setting HttpOnly cookie over non-HTTP API": {
+ topic: function () {
+ var cj = new CookieJar();
+ var c = Cookie.parse("a=b; Domain=example.com; Path=/; HttpOnly");
+ cj.setCookie(c, 'http://example.com/index.html', {http: false}, this.callback);
+ },
+ "fails": function (err, c) {
+ assert.match(err.message, /HttpOnly/i);
+ assert.ok(!c);
+ }
+ }
+ })
+ .addBatch({
+ "Store eight cookies": {
+ topic: function () {
+ var cj = new CookieJar();
+ var ex = 'http://example.com/index.html';
+ var tasks = [];
+ tasks.push(function (next) {
+ cj.setCookie('a=1; Domain=example.com; Path=/', ex, at(0), next);
+ });
+ tasks.push(function (next) {
+ cj.setCookie('b=2; Domain=example.com; Path=/; HttpOnly', ex, at(1000), next);
+ });
+ tasks.push(function (next) {
+ cj.setCookie('c=3; Domain=example.com; Path=/; Secure', ex, at(2000), next);
+ });
+ tasks.push(function (next) { // path
+ cj.setCookie('d=4; Domain=example.com; Path=/foo', ex, at(3000), next);
+ });
+ tasks.push(function (next) { // host only
+ cj.setCookie('e=5', ex, at(4000), next);
+ });
+ tasks.push(function (next) { // other domain
+ cj.setCookie('f=6; Domain=nodejs.org; Path=/', 'http://nodejs.org', at(5000), next);
+ });
+ tasks.push(function (next) { // expired
+ cj.setCookie('g=7; Domain=example.com; Path=/; Expires=Tue, 18 Oct 2011 00:00:00 GMT', ex, at(6000), next);
+ });
+ tasks.push(function (next) { // expired via Max-Age
+ cj.setCookie('h=8; Domain=example.com; Path=/; Max-Age=1', ex, next);
+ });
+ var cb = this.callback;
+ async.parallel(tasks, function (err, results) {
+ setTimeout(function () {
+ cb(err, cj, results);
+ }, 2000); // so that 'h=8' expires
+ });
+ },
+ "setup ok": function (err, cj, results) {
+ assert.ok(!err);
+ assert.ok(cj);
+ assert.ok(results);
+ },
+ "then retrieving for http://nodejs.org": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('http://nodejs.org', this.callback);
+ },
+ "get a nodejs cookie": function (cookies) {
+ assert.lengthOf(cookies, 1);
+ var cookie = cookies[0];
+ assert.equal(cookie.domain, 'nodejs.org');
+ }
+ },
+ "then retrieving for https://example.com": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('https://example.com', {secure: true}, this.callback);
+ },
+ "get a secure example cookie with others": function (cookies) {
+ var names = cookies.map(function (c) {
+ return c.key
+ });
+ assert.deepEqual(names, ['a', 'b', 'c', 'e']);
+ }
+ },
+ "then retrieving for https://example.com (missing options)": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('https://example.com', this.callback);
+ },
+ "get a secure example cookie with others": function (cookies) {
+ var names = cookies.map(function (c) {
+ return c.key
+ });
+ assert.deepEqual(names, ['a', 'b', 'c', 'e']);
+ }
+ },
+ "then retrieving for http://example.com": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('http://example.com', this.callback);
+ },
+ "get a bunch of cookies": function (cookies) {
+ var names = cookies.map(function (c) {
+ return c.key
+ });
+ assert.deepEqual(names, ['a', 'b', 'e']);
+ }
+ },
+ "then retrieving for http://EXAMPlE.com": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('http://EXAMPlE.com', this.callback);
+ },
+ "get a bunch of cookies": function (cookies) {
+ var names = cookies.map(function (c) {
+ return c.key
+ });
+ assert.deepEqual(names, ['a', 'b', 'e']);
+ }
+ },
+ "then retrieving for http://example.com, non-HTTP": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('http://example.com', {http: false}, this.callback);
+ },
+ "get a bunch of cookies": function (cookies) {
+ var names = cookies.map(function (c) {
+ return c.key
+ });
+ assert.deepEqual(names, ['a', 'e']);
+ }
+ },
+ "then retrieving for http://example.com/foo/bar": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('http://example.com/foo/bar', this.callback);
+ },
+ "get a bunch of cookies": function (cookies) {
+ var names = cookies.map(function (c) {
+ return c.key
+ });
+ assert.deepEqual(names, ['d', 'a', 'b', 'e']);
+ }
+ },
+ "then retrieving for http://example.com as a string": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookieString('http://example.com', this.callback);
+ },
+ "get a single string": function (cookieHeader) {
+ assert.equal(cookieHeader, "a=1; b=2; e=5");
+ }
+ },
+ "then retrieving for http://example.com as a set-cookie header": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getSetCookieStrings('http://example.com', this.callback);
+ },
+ "get a single string": function (cookieHeaders) {
+ assert.lengthOf(cookieHeaders, 3);
+ assert.equal(cookieHeaders[0], "a=1; Domain=example.com; Path=/");
+ assert.equal(cookieHeaders[1], "b=2; Domain=example.com; Path=/; HttpOnly");
+ assert.equal(cookieHeaders[2], "e=5; Path=/");
+ }
+ },
+ "then retrieving for http://www.example.com/": {
+ topic: function (cj, oldResults) {
+ assert.ok(oldResults);
+ cj.getCookies('http://www.example.com/foo/bar', this.callback);
+ },
+ "get a bunch of cookies": function (cookies) {
+ var names = cookies.map(function (c) {
+ return c.key
+ });
+ assert.deepEqual(names, ['d', 'a', 'b']); // note lack of 'e'
+ }
+ }
+ }
+ })
+ .addBatch({
+ "Repeated names": {
+ topic: function () {
+ var cb = this.callback;
+ var cj = new CookieJar();
+ var ex = 'http://www.example.com/';
+ var sc = cj.setCookie;
+ var tasks = [];
+ var now = Date.now();
+ tasks.push(sc.bind(cj, 'aaaa=xxxx', ex, at(0)));
+ tasks.push(sc.bind(cj, 'aaaa=1111; Domain=www.example.com', ex, at(1000)));
+ tasks.push(sc.bind(cj, 'aaaa=2222; Domain=example.com', ex, at(2000)));
+ tasks.push(sc.bind(cj, 'aaaa=3333; Domain=www.example.com; Path=/pathA', ex, at(3000)));
+ async.series(tasks, function (err, results) {
+ results = results.filter(function (e) {
+ return e !== undefined
+ });
+ cb(err, {cj: cj, cookies: results, now: now});
+ });
+ },
+ "all got set": function (err, t) {
+ assert.lengthOf(t.cookies, 4);
+ },
+ "then getting 'em back": {
+ topic: function (t) {
+ var cj = t.cj;
+ cj.getCookies('http://www.example.com/pathA', this.callback);
+ },
+ "there's just three": function (err, cookies) {
+ var vals = cookies.map(function (c) {
+ return c.value
+ });
+ // may break with sorting; sorting should put 3333 first due to longest path:
+ assert.deepEqual(vals, ['3333', '1111', '2222']);
+ }
+ }
+ }
+ })
+ .addBatch({
+ "CookieJar setCookie errors": {
+ "public-suffix domain": {
+ topic: function () {
+ var cj = new CookieJar();
+ cj.setCookie('i=9; Domain=kyoto.jp; Path=/', 'kyoto.jp', this.callback);
+ },
+ "errors": function (err, cookie) {
+ assert.ok(err);
+ assert.ok(!cookie);
+ assert.match(err.message, /public suffix/i);
+ }
+ },
+ "wrong domain": {
+ topic: function () {
+ var cj = new CookieJar();
+ cj.setCookie('j=10; Domain=google.com; Path=/', 'http://google.ca', this.callback);
+ },
+ "errors": function (err, cookie) {
+ assert.ok(err);
+ assert.ok(!cookie);
+ assert.match(err.message, /not in this host's domain/i);
+ }
+ },
+ "old cookie is HttpOnly": {
+ topic: function () {
+ var cb = this.callback;
+ var next = function (err, c) {
+ c = null;
+ return cb(err, cj);
+ };
+ var cj = new CookieJar();
+ cj.setCookie('k=11; Domain=example.ca; Path=/; HttpOnly', 'http://example.ca', {http: true}, next);
+ },
+ "initial cookie is set": function (err, cj) {
+ assert.ok(!err);
+ assert.ok(cj);
+ },
+ "but when trying to overwrite": {
+ topic: function (cj) {
+ var cb = this.callback;
+ var next = function (err, c) {
+ c = null;
+ cb(null, err);
+ };
+ cj.setCookie('k=12; Domain=example.ca; Path=/', 'http://example.ca', {http: false}, next);
+ },
+ "it's an error": function (err) {
+ assert.ok(err);
+ },
+ "then, checking the original": {
+ topic: function (ignored, cj) {
+ assert.ok(cj instanceof CookieJar);
+ cj.getCookies('http://example.ca', {http: true}, this.callback);
+ },
+ "cookie has original value": function (err, cookies) {
+ assert.equal(err, null);
+ assert.lengthOf(cookies, 1);
+ assert.equal(cookies[0].value, 11);
+ }
+ }
+ }
+ },
+ "similar to public suffix": {
+ topic: function () {
+ var cj = new CookieJar();
+ var url = 'http://www.foonet.net';
+ assert.isTrue(cj.rejectPublicSuffixes);
+ cj.setCookie('l=13; Domain=foonet.net; Path=/', url, this.callback);
+ },
+ "doesn't error": function (err, cookie) {
+ assert.ok(!err);
+ assert.ok(cookie);
+ }
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js b/node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js
new file mode 100644
index 000000000..8cc984272
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js
@@ -0,0 +1,90 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+
+function toKeyArray(cookies) {
+ return cookies.map(function (c) {
+ return c.key
+ });
+}
+
+vows
+ .describe('Cookie sorting')
+ .addBatch({
+ "Cookie Sorting": {
+ topic: function () {
+ var cookies = [];
+ cookies.push(Cookie.parse("a=0; Domain=example.com"));
+ cookies.push(Cookie.parse("b=1; Domain=www.example.com"));
+ cookies.push(Cookie.parse("c=2; Domain=example.com; Path=/pathA"));
+ cookies.push(Cookie.parse("d=3; Domain=www.example.com; Path=/pathA"));
+ cookies.push(Cookie.parse("e=4; Domain=example.com; Path=/pathA/pathB"));
+ cookies.push(Cookie.parse("f=5; Domain=www.example.com; Path=/pathA/pathB"));
+
+ // weak shuffle:
+ cookies = cookies.sort(function () {
+ return Math.random() - 0.5
+ });
+
+ cookies = cookies.sort(tough.cookieCompare);
+ return cookies;
+ },
+ "got": function (cookies) {
+ assert.lengthOf(cookies, 6);
+ assert.deepEqual(toKeyArray(cookies), ['e', 'f', 'c', 'd', 'a', 'b']);
+ }
+ }
+ })
+ .addBatch({
+ "Changing creation date affects sorting": {
+ topic: function () {
+ var cookies = [];
+ var now = Date.now();
+ cookies.push(Cookie.parse("a=0;"));
+ cookies.push(Cookie.parse("b=1;"));
+ cookies.push(Cookie.parse("c=2;"));
+
+ cookies.forEach(function (cookie, idx) {
+ cookie.creation = new Date(now - 100 * idx);
+ });
+
+ return cookies.sort(tough.cookieCompare);
+ },
+ "got": function (cookies) {
+ assert.deepEqual(toKeyArray(cookies), ['c', 'b', 'a']);
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js b/node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js
new file mode 100644
index 000000000..cc3f1fc85
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js
@@ -0,0 +1,164 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+
+vows
+ .describe('Cookie.toJSON()')
+ .addBatch({
+ "JSON": {
+ "serialization": {
+ topic: function() {
+ var c = Cookie.parse('alpha=beta; Domain=example.com; Path=/foo; Expires=Tue, 19 Jan 2038 03:14:07 GMT; HttpOnly');
+ return JSON.stringify(c);
+ },
+ "gives a string": function(str) {
+ assert.equal(typeof str, "string");
+ },
+ "date is in ISO format": function(str) {
+ assert.match(str, /"expires":"2038-01-19T03:14:07\.000Z"/, 'expires is in ISO format');
+ }
+ },
+ "deserialization": {
+ topic: function() {
+ var json = '{"key":"alpha","value":"beta","domain":"example.com","path":"/foo","expires":"2038-01-19T03:14:07.000Z","httpOnly":true,"lastAccessed":2000000000123}';
+ return Cookie.fromJSON(json);
+ },
+ "works": function(c) {
+ assert.ok(c);
+ },
+ "key": function(c) { assert.equal(c.key, "alpha") },
+ "value": function(c) { assert.equal(c.value, "beta") },
+ "domain": function(c) { assert.equal(c.domain, "example.com") },
+ "path": function(c) { assert.equal(c.path, "/foo") },
+ "httpOnly": function(c) { assert.strictEqual(c.httpOnly, true) },
+ "secure": function(c) { assert.strictEqual(c.secure, false) },
+ "hostOnly": function(c) { assert.strictEqual(c.hostOnly, null) },
+ "expires is a date object": function(c) {
+ assert.equal(c.expires.getTime(), 2147483647000);
+ },
+ "lastAccessed is a date object": function(c) {
+ assert.equal(c.lastAccessed.getTime(), 2000000000123);
+ },
+ "creation defaulted": function(c) {
+ assert.ok(c.creation.getTime());
+ }
+ },
+ "null deserialization": {
+ topic: function() {
+ return Cookie.fromJSON(null);
+ },
+ "is null": function(cookie) {
+ assert.equal(cookie,null);
+ }
+ }
+ },
+ "expiry deserialization": {
+ "Infinity": {
+ topic: Cookie.fromJSON.bind(null, '{"expires":"Infinity"}'),
+ "is infinite": function(c) {
+ assert.strictEqual(c.expires, "Infinity");
+ assert.equal(c.expires, Infinity);
+ }
+ }
+ },
+ "maxAge serialization": {
+ topic: function() {
+ return function(toSet) {
+ var c = new Cookie();
+ c.key = 'foo'; c.value = 'bar';
+ c.setMaxAge(toSet);
+ return JSON.stringify(c);
+ };
+ },
+ "zero": {
+ topic: function(f) { return f(0) },
+ "looks good": function(str) {
+ assert.match(str, /"maxAge":0/);
+ }
+ },
+ "Infinity": {
+ topic: function(f) { return f(Infinity) },
+ "looks good": function(str) {
+ assert.match(str, /"maxAge":"Infinity"/);
+ }
+ },
+ "-Infinity": {
+ topic: function(f) { return f(-Infinity) },
+ "looks good": function(str) {
+ assert.match(str, /"maxAge":"-Infinity"/);
+ }
+ },
+ "null": {
+ topic: function(f) { return f(null) },
+ "looks good": function(str) {
+ assert.match(str, /"maxAge":null/);
+ }
+ }
+ },
+ "maxAge deserialization": {
+ "number": {
+ topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":123}'),
+ "is the number": function(c) {
+ assert.strictEqual(c.maxAge, 123);
+ }
+ },
+ "null": {
+ topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":null}'),
+ "is null": function(c) {
+ assert.strictEqual(c.maxAge, null);
+ }
+ },
+ "less than zero": {
+ topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":-123}'),
+ "is -123": function(c) {
+ assert.strictEqual(c.maxAge, -123);
+ }
+ },
+ "Infinity": {
+ topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"Infinity"}'),
+ "is inf-as-string": function(c) {
+ assert.strictEqual(c.maxAge, "Infinity");
+ }
+ },
+ "-Infinity": {
+ topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"-Infinity"}'),
+ "is inf-as-string": function(c) {
+ assert.strictEqual(c.maxAge, "-Infinity");
+ }
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js b/node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js
new file mode 100644
index 000000000..b7ad10da1
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js
@@ -0,0 +1,162 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+
+vows
+ .describe('Cookie.toString()')
+ .addBatch({
+ "a simple cookie": {
+ topic: function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ return c;
+ },
+ "validates": function (c) {
+ assert.ok(c.validate());
+ },
+ "to string": function (c) {
+ assert.equal(c.toString(), 'a=b');
+ }
+ },
+ "a cookie with spaces in the value": {
+ topic: function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'beta gamma';
+ return c;
+ },
+ "doesn't validate": function (c) {
+ assert.ok(!c.validate());
+ },
+ "'garbage in, garbage out'": function (c) {
+ assert.equal(c.toString(), 'a=beta gamma');
+ }
+ },
+ "with an empty value and HttpOnly": {
+ topic: function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.httpOnly = true;
+ return c;
+ },
+ "to string": function (c) {
+ assert.equal(c.toString(), 'a=; HttpOnly');
+ }
+ },
+ "with an expiry": {
+ topic: function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ c.setExpires("Oct 18 2011 07:05:03 GMT");
+ return c;
+ },
+ "validates": function (c) {
+ assert.ok(c.validate());
+ },
+ "to string": function (c) {
+ assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT');
+ },
+ "to short string": function (c) {
+ assert.equal(c.cookieString(), 'a=b');
+ }
+ },
+ "with a max-age": {
+ topic: function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ c.setExpires("Oct 18 2011 07:05:03 GMT");
+ c.maxAge = 12345;
+ return c;
+ },
+ "validates": function (c) {
+ assert.ok(c.validate()); // mabe this one *shouldn't*?
+ },
+ "to string": function (c) {
+ assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345');
+ }
+ },
+ "with a bunch of things": function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ c.setExpires("Oct 18 2011 07:05:03 GMT");
+ c.maxAge = 12345;
+ c.domain = 'example.com';
+ c.path = '/foo';
+ c.secure = true;
+ c.httpOnly = true;
+ c.extensions = ['MyExtension'];
+ assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345; Domain=example.com; Path=/foo; Secure; HttpOnly; MyExtension');
+ },
+ "a host-only cookie": {
+ topic: function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ c.hostOnly = true;
+ c.domain = 'shouldnt-stringify.example.com';
+ c.path = '/should-stringify';
+ return c;
+ },
+ "validates": function (c) {
+ assert.ok(c.validate());
+ },
+ "to string": function (c) {
+ assert.equal(c.toString(), 'a=b; Path=/should-stringify');
+ }
+ },
+ "minutes are '10'": {
+ topic: function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ c.expires = new Date(1284113410000);
+ return c;
+ },
+ "validates": function (c) {
+ assert.ok(c.validate());
+ },
+ "to string": function (c) {
+ var str = c.toString();
+ assert.notEqual(str, 'a=b; Expires=Fri, 010 Sep 2010 010:010:010 GMT');
+ assert.equal(str, 'a=b; Expires=Fri, 10 Sep 2010 10:10:10 GMT');
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/date_test.js b/node_modules/request/node_modules/tough-cookie/test/date_test.js
new file mode 100644
index 000000000..afd989c54
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/date_test.js
@@ -0,0 +1,79 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var tough = require('../lib/cookie');
+
+function dateVows(table) {
+ var theVows = {};
+ Object.keys(table).forEach(function (date) {
+ var expect = table[date];
+ theVows[date] = function () {
+ var got = tough.parseDate(date) ? 'valid' : 'invalid';
+ assert.equal(got, expect ? 'valid' : 'invalid');
+ };
+ });
+ return {"date parsing": theVows};
+}
+
+vows
+ .describe('Date')
+ .addBatch(dateVows({
+ "Wed, 09 Jun 2021 10:18:14 GMT": true,
+ "Wed, 09 Jun 2021 22:18:14 GMT": true,
+ "Tue, 18 Oct 2011 07:42:42.123 GMT": true,
+ "18 Oct 2011 07:42:42 GMT": true,
+ "8 Oct 2011 7:42:42 GMT": true,
+ "8 Oct 2011 7:2:42 GMT": true,
+ "Oct 18 2011 07:42:42 GMT": true,
+ "Tue Oct 18 2011 07:05:03 GMT+0000 (GMT)": true,
+ "09 Jun 2021 10:18:14 GMT": true,
+ "99 Jix 3038 48:86:72 ZMT": false,
+ '01 Jan 1970 00:00:00 GMT': true,
+ '01 Jan 1600 00:00:00 GMT': false, // before 1601
+ '01 Jan 1601 00:00:00 GMT': true,
+ '10 Feb 81 13:00:00 GMT': true, // implicit year
+ 'Thu, 17-Apr-2014 02:12:29 GMT': true, // dashes
+ 'Thu, 17-Apr-2014 02:12:29 UTC': true // dashes and UTC
+ }))
+ .addBatch({
+ "strict date parse of Thu, 01 Jan 1970 00:00:010 GMT": {
+ topic: function () {
+ return tough.parseDate('Thu, 01 Jan 1970 00:00:010 GMT', true) ? true : false;
+ },
+ "invalid": function (date) {
+ assert.equal(date, false);
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js b/node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js
new file mode 100644
index 000000000..36b85b9b3
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js
@@ -0,0 +1,201 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+
+function matchVows(func, table) {
+ var theVows = {};
+ table.forEach(function (item) {
+ var str = item[0];
+ var dom = item[1];
+ var expect = item[2];
+ var label = str + (expect ? " matches " : " doesn't match ") + dom;
+ theVows[label] = function () {
+ assert.equal(func(str, dom), expect);
+ };
+ });
+ return theVows;
+}
+
+function defaultPathVows(table) {
+ var theVows = {};
+ table.forEach(function (item) {
+ var str = item[0];
+ var expect = item[1];
+ var label = str + " gives " + expect;
+ theVows[label] = function () {
+ assert.equal(tough.defaultPath(str), expect);
+ };
+ });
+ return theVows;
+}
+
+vows
+ .describe('Domain and Path')
+ .addBatch({
+ "domain normalization": {
+ "simple": function () {
+ var c = new Cookie();
+ c.domain = "EXAMPLE.com";
+ assert.equal(c.canonicalizedDomain(), "example.com");
+ },
+ "extra dots": function () {
+ var c = new Cookie();
+ c.domain = ".EXAMPLE.com";
+ assert.equal(c.cdomain(), "example.com");
+ },
+ "weird trailing dot": function () {
+ var c = new Cookie();
+ c.domain = "EXAMPLE.ca.";
+ assert.equal(c.canonicalizedDomain(), "example.ca.");
+ },
+ "weird internal dots": function () {
+ var c = new Cookie();
+ c.domain = "EXAMPLE...ca.";
+ assert.equal(c.canonicalizedDomain(), "example...ca.");
+ },
+ "IDN": function () {
+ var c = new Cookie();
+ c.domain = "δοκιμή.δοκιμή"; // "test.test" in greek
+ assert.equal(c.canonicalizedDomain(), "xn--jxalpdlp.xn--jxalpdlp");
+ }
+ }
+ })
+ .addBatch({
+ "Domain Match": matchVows(tough.domainMatch, [
+ // str, dom, expect
+ ["example.com", "example.com", true],
+ ["eXaMpLe.cOm", "ExAmPlE.CoM", true],
+ ["no.ca", "yes.ca", false],
+ ["wwwexample.com", "example.com", false],
+ ["www.example.com", "example.com", true],
+ ["example.com", "www.example.com", false],
+ ["www.subdom.example.com", "example.com", true],
+ ["www.subdom.example.com", "subdom.example.com", true],
+ ["example.com", "example.com.", false], // RFC6265 S4.1.2.3
+ ["192.168.0.1", "168.0.1", false], // S5.1.3 "The string is a host name"
+ [null, "example.com", null],
+ ["example.com", null, null],
+ [null, null, null],
+ [undefined, undefined, null],
+ ])
+ })
+
+ .addBatch({
+ "default-path": defaultPathVows([
+ [null, "/"],
+ ["/", "/"],
+ ["/file", "/"],
+ ["/dir/file", "/dir"],
+ ["noslash", "/"],
+ ])
+ })
+ .addBatch({
+ "Path-Match": matchVows(tough.pathMatch, [
+ // request, cookie, match
+ ["/", "/", true],
+ ["/dir", "/", true],
+ ["/", "/dir", false],
+ ["/dir/", "/dir/", true],
+ ["/dir/file", "/dir/", true],
+ ["/dir/file", "/dir", true],
+ ["/directory", "/dir", false],
+ ])
+ })
+ .addBatch({
+ "permuteDomain": {
+ "base case": {
+ topic: tough.permuteDomain.bind(null, 'example.com'),
+ "got the domain": function (list) {
+ assert.deepEqual(list, ['example.com']);
+ }
+ },
+ "two levels": {
+ topic: tough.permuteDomain.bind(null, 'foo.bar.example.com'),
+ "got three things": function (list) {
+ assert.deepEqual(list, ['example.com', 'bar.example.com', 'foo.bar.example.com']);
+ }
+ },
+ "local domain": {
+ topic: tough.permuteDomain.bind(null, 'foo.bar.example.localduhmain'),
+ "got three things": function (list) {
+ assert.deepEqual(list, ['example.localduhmain', 'bar.example.localduhmain', 'foo.bar.example.localduhmain']);
+ }
+ }
+ },
+ "permutePath": {
+ "base case": {
+ topic: tough.permutePath.bind(null, '/'),
+ "just slash": function (list) {
+ assert.deepEqual(list, ['/']);
+ }
+ },
+ "single case": {
+ topic: tough.permutePath.bind(null, '/foo'),
+ "two things": function (list) {
+ assert.deepEqual(list, ['/foo', '/']);
+ },
+ "path matching": function (list) {
+ list.forEach(function (e) {
+ assert.ok(tough.pathMatch('/foo', e));
+ });
+ }
+ },
+ "double case": {
+ topic: tough.permutePath.bind(null, '/foo/bar'),
+ "four things": function (list) {
+ assert.deepEqual(list, ['/foo/bar', '/foo', '/']);
+ },
+ "path matching": function (list) {
+ list.forEach(function (e) {
+ assert.ok(tough.pathMatch('/foo/bar', e));
+ });
+ }
+ },
+ "trailing slash": {
+ topic: tough.permutePath.bind(null, '/foo/bar/'),
+ "three things": function (list) {
+ assert.deepEqual(list, ['/foo/bar', '/foo', '/']);
+ },
+ "path matching": function (list) {
+ list.forEach(function (e) {
+ assert.ok(tough.pathMatch('/foo/bar/', e));
+ });
+ }
+ }
+ }
+ })
+ .export(module);
+
diff --git a/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json b/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json
new file mode 100644
index 000000000..bc43160da
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json
@@ -0,0 +1,168 @@
+[
+ {
+ "test": "Sat, 15-Apr-17 21:01:22 GMT",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Thu, 19-Apr-2007 16:00:00 GMT",
+ "expected": "Thu, 19 Apr 2007 16:00:00 GMT"
+ }, {
+ "test": "Wed, 25 Apr 2007 21:02:13 GMT",
+ "expected": "Wed, 25 Apr 2007 21:02:13 GMT"
+ }, {
+ "test": "Thu, 19/Apr\\2007 16:00:00 GMT",
+ "expected": "Thu, 19 Apr 2007 16:00:00 GMT"
+ }, {
+ "test": "Fri, 1 Jan 2010 01:01:50 GMT",
+ "expected": "Fri, 01 Jan 2010 01:01:50 GMT"
+ }, {
+ "test": "Wednesday, 1-Jan-2003 00:00:00 GMT",
+ "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
+ }, {
+ "test": ", 1-Jan-2003 00:00:00 GMT",
+ "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
+ }, {
+ "test": " 1-Jan-2003 00:00:00 GMT",
+ "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
+ }, {
+ "test": "1-Jan-2003 00:00:00 GMT",
+ "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
+ }, {
+ "test": "Wed,18-Apr-07 22:50:12 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "WillyWonka , 18-Apr-07 22:50:12 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "WillyWonka , 18-Apr-07 22:50:12",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "WillyWonka , 18-apr-07 22:50:12",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Mon, 18-Apr-1977 22:50:13 GMT",
+ "expected": "Mon, 18 Apr 1977 22:50:13 GMT"
+ }, {
+ "test": "Mon, 18-Apr-77 22:50:13 GMT",
+ "expected": "Mon, 18 Apr 1977 22:50:13 GMT"
+ }, {
+ "test": "\"Sat, 15-Apr-17\\\"21:01:22\\\"GMT\"",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Partyday, 18- April-07 22:50:12",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Partyday, 18 - Apri-07 22:50:12",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Wednes, 1-Januar-2003 00:00:00 GMT",
+ "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 GMT-2",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 GMT BLAH",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 GMT-0400",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 GMT-0400 (EDT)",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 DST",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 -0400",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 (hello there)",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 11:22:33",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 ::00 21:01:22",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 boink:z 21:01:22",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 91:22:33 21:01:22",
+ "expected": null
+ }, {
+ "test": "Thu Apr 18 22:50:12 2007 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "22:50:12 Thu Apr 18 2007 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Thu 22:50:12 Apr 18 2007 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Thu Apr 22:50:12 18 2007 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Thu Apr 18 22:50:12 2007 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Thu Apr 18 2007 22:50:12 GMT",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Thu Apr 18 2007 GMT 22:50:12",
+ "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
+ }, {
+ "test": "Sat, 15-Apr-17 21:01:22 GMT",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "15-Sat, Apr-17 21:01:22 GMT",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "15-Sat, Apr 21:01:22 GMT 17",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "15-Sat, Apr 21:01:22 GMT 2017",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "15 Apr 21:01:22 2017",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "15 17 Apr 21:01:22",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Apr 15 17 21:01:22",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "Apr 15 21:01:22 17",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "2017 April 15 21:01:22",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "15 April 2017 21:01:22",
+ "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
+ }, {
+ "test": "98 April 17 21:01:22",
+ "expected": null
+ }, {
+ "test": "Thu, 012-Aug-2008 20:49:07 GMT",
+ "expected": null
+ }, {
+ "test": "Thu, 12-Aug-31841 20:49:07 GMT",
+ "expected": null
+ }, {
+ "test": "Thu, 12-Aug-9999999999 20:49:07 GMT",
+ "expected": null
+ }, {
+ "test": "Thu, 999999999999-Aug-2007 20:49:07 GMT",
+ "expected": null
+ }, {
+ "test": "Thu, 12-Aug-2007 20:61:99999999999 GMT",
+ "expected": null
+ }, {
+ "test": "IAintNoDateFool",
+ "expected": null
+ }
+]
diff --git a/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json b/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json
new file mode 100644
index 000000000..61e674d44
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json
@@ -0,0 +1,48 @@
+[
+ {
+ "test": "Mon, 10-Dec-2007 17:02:24 GMT",
+ "expected": "Mon, 10 Dec 2007 17:02:24 GMT"
+ }, {
+ "test": "Wed, 09 Dec 2009 16:27:23 GMT",
+ "expected": "Wed, 09 Dec 2009 16:27:23 GMT"
+ }, {
+ "test": "Thursday, 01-Jan-1970 00:00:00 GMT",
+ "expected": "Thu, 01 Jan 1970 00:00:00 GMT"
+ }, {
+ "test": "Mon Dec 10 16:32:30 2007 GMT",
+ "expected": "Mon, 10 Dec 2007 16:32:30 GMT"
+ }, {
+ "test": "Wednesday, 01-Jan-10 00:00:00 GMT",
+ "expected": "Fri, 01 Jan 2010 00:00:00 GMT"
+ }, {
+ "test": "Mon, 10-Dec-07 20:35:03 GMT",
+ "expected": "Mon, 10 Dec 2007 20:35:03 GMT"
+ }, {
+ "test": "Wed, 1 Jan 2020 00:00:00 GMT",
+ "expected": "Wed, 01 Jan 2020 00:00:00 GMT"
+ }, {
+ "test": "Saturday, 8-Dec-2012 21:24:09 GMT",
+ "expected": "Sat, 08 Dec 2012 21:24:09 GMT"
+ }, {
+ "test": "Thu, 31 Dec 23:55:55 2037 GMT",
+ "expected": "Thu, 31 Dec 2037 23:55:55 GMT"
+ }, {
+ "test": "Sun, 9 Dec 2012 13:42:05 GMT",
+ "expected": "Sun, 09 Dec 2012 13:42:05 GMT"
+ }, {
+ "test": "Wed Dec 12 2007 08:44:07 GMT-0500 (EST)",
+ "expected": "Wed, 12 Dec 2007 08:44:07 GMT"
+ }, {
+ "test": "Mon, 01-Jan-2011 00: 00:00 GMT",
+ "expected": null
+ }, {
+ "test": "Sun, 1-Jan-1995 00:00:00 GMT",
+ "expected": "Sun, 01 Jan 1995 00:00:00 GMT"
+ }, {
+ "test": "Wednesday, 01-Jan-10 0:0:00 GMT",
+ "expected": "Fri, 01 Jan 2010 00:00:00 GMT"
+ }, {
+ "test": "Thu, 10 Dec 2009 13:57:2 GMT",
+ "expected": "Thu, 10 Dec 2009 13:57:02 GMT"
+ }
+]
diff --git a/node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json b/node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json
new file mode 100644
index 000000000..783f660bf
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json
@@ -0,0 +1,1959 @@
+[
+ {
+ "test": "0001",
+ "received": [
+ "foo=bar"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0002",
+ "received": [
+ "foo=bar; Expires=Fri, 07 Aug 2019 08:04:19 GMT"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0003",
+ "received": [
+ "foo=bar; Expires=Fri, 07 Aug 2007 08:04:19 GMT",
+ "foo2=bar2; Expires=Fri, 07 Aug 2017 08:04:19 GMT"
+ ],
+ "sent": [
+ { "name": "foo2", "value": "bar2" }
+ ]
+ },
+ {
+ "test": "0004",
+ "received": [
+ "foo"
+ ],
+ "sent": []
+ },
+ {
+ "test": "0005",
+ "received": [
+ "foo=bar; max-age=10000;"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0006",
+ "received": [
+ "foo=bar; max-age=0;"
+ ],
+ "sent": []
+ },
+ {
+ "test": "0007",
+ "received": [
+ "foo=bar; version=1;"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0008",
+ "received": [
+ "foo=bar; version=1000;"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0009",
+ "received": [
+ "foo=bar; customvalue=1000;"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0010",
+ "received": [
+ "foo=bar; secure;"
+ ],
+ "sent": []
+ },
+ {
+ "test": "0011",
+ "received": [
+ "foo=bar; customvalue=\"1000 or more\";"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0012",
+ "received": [
+ "foo=bar; customvalue=\"no trailing semicolon\""
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "0013",
+ "received": [
+ "foo=bar",
+ "foo=qux"
+ ],
+ "sent": [
+ { "name": "foo", "value": "qux" }
+ ]
+ },
+ {
+ "test": "0014",
+ "received": [
+ "foo1=bar",
+ "foo2=qux"
+ ],
+ "sent": [
+ { "name": "foo1", "value": "bar" },
+ { "name": "foo2", "value": "qux" }
+ ]
+ },
+ {
+ "test": "0015",
+ "received": [
+ "a=b",
+ "z=y"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" },
+ { "name": "z", "value": "y" }
+ ]
+ },
+ {
+ "test": "0016",
+ "received": [
+ "z=y",
+ "a=b"
+ ],
+ "sent": [
+ { "name": "z", "value": "y" },
+ { "name": "a", "value": "b" }
+ ]
+ },
+ {
+ "test": "0017",
+ "received": [
+ "z=y, a=b"
+ ],
+ "sent": [
+ { "name": "z", "value": "y, a=b" }
+ ]
+ },
+ {
+ "test": "0018",
+ "received": [
+ "z=y; foo=bar, a=b"
+ ],
+ "sent": [
+ { "name": "z", "value": "y" }
+ ]
+ },
+ {
+ "test": "0019",
+ "received": [
+ "foo=b;max-age=3600, c=d;path=/"
+ ],
+ "sent": [
+ { "name": "foo", "value": "b" }
+ ]
+ },
+ {
+ "test": "0020",
+ "received": [
+ "a=b",
+ "=",
+ "c=d"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" },
+ { "name": "c", "value": "d" }
+ ]
+ },
+ {
+ "test": "0021",
+ "received": [
+ "a=b",
+ "=x",
+ "c=d"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" },
+ { "name": "c", "value": "d" }
+ ]
+ },
+ {
+ "test": "0022",
+ "received": [
+ "a=b",
+ "x=",
+ "c=d"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" },
+ { "name": "x", "value": "" },
+ { "name": "c", "value": "d" }
+ ]
+ },
+ {
+ "test": "0023",
+ "received": [
+ "foo",
+ ""
+ ],
+ "sent": []
+ },
+ {
+ "test": "0024",
+ "received": [
+ "foo",
+ "="
+ ],
+ "sent": []
+ },
+ {
+ "test": "0025",
+ "received": [
+ "foo",
+ "; bar"
+ ],
+ "sent": []
+ },
+ {
+ "test": "0026",
+ "received": [
+ "foo",
+ " "
+ ],
+ "sent": []
+ },
+ {
+ "test": "0027",
+ "received": [
+ "foo",
+ "bar"
+ ],
+ "sent": []
+ },
+ {
+ "test": "0028",
+ "received": [
+ "foo",
+ "\t"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0001",
+ "received": [
+ "foo=bar; Secure"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0002",
+ "received": [
+ "foo=bar; seCURe"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0003",
+ "received": [
+ "foo=bar; \"Secure\""
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "ATTRIBUTE0004",
+ "received": [
+ "foo=bar; Secure="
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0005",
+ "received": [
+ "foo=bar; Secure=aaaa"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0006",
+ "received": [
+ "foo=bar; Secure qux"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "ATTRIBUTE0007",
+ "received": [
+ "foo=bar; Secure =aaaaa"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0008",
+ "received": [
+ "foo=bar; Secure= aaaaa"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0009",
+ "received": [
+ "foo=bar; Secure; qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0010",
+ "received": [
+ "foo=bar; Secure;qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0011",
+ "received": [
+ "foo=bar; Secure ; qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0012",
+ "received": [
+ "foo=bar; Secure"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0013",
+ "received": [
+ "foo=bar; Secure ;"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0014",
+ "received": [
+ "foo=bar; Path"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "ATTRIBUTE0015",
+ "received": [
+ "foo=bar; Path="
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "ATTRIBUTE0016",
+ "received": [
+ "foo=bar; Path=/"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "ATTRIBUTE0017",
+ "received": [
+ "foo=bar; Path=/qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0018",
+ "received": [
+ "foo=bar; Path =/qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0019",
+ "received": [
+ "foo=bar; Path= /qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0020",
+ "received": [
+ "foo=bar; Path=/qux ; taz"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0021",
+ "received": [
+ "foo=bar; Path=/qux; Path=/"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "ATTRIBUTE0022",
+ "received": [
+ "foo=bar; Path=/; Path=/qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0023",
+ "received": [
+ "foo=bar; Path=/qux; Path=/cookie-parser-result"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "ATTRIBUTE0024",
+ "received": [
+ "foo=bar; Path=/cookie-parser-result; Path=/qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0025",
+ "received": [
+ "foo=bar; qux; Secure"
+ ],
+ "sent": []
+ },
+ {
+ "test": "ATTRIBUTE0026",
+ "received": [
+ "foo=bar; qux=\"aaa;bbb\"; Secure"
+ ],
+ "sent": []
+ },
+ {
+ "test": "CHARSET0001",
+ "received": [
+ "foo=\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c"
+ ],
+ "sent": [
+ { "name": "foo", "value": "\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" }
+ ]
+ },
+ {
+ "test": "CHARSET0002",
+ "received": [
+ "\u6625\u8282\u56de=\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c"
+ ],
+ "sent": [
+ { "name": "\u6625\u8282\u56de", "value": "\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" }
+ ]
+ },
+ {
+ "test": "CHARSET0003",
+ "received": [
+ "\u6625\u8282\u56de=\u5bb6\u8def\u00b7\u6625\u8fd0; \u5b8c\u5168\u624b\u518c"
+ ],
+ "sent": [
+ { "name": "\u6625\u8282\u56de", "value": "\u5bb6\u8def\u00b7\u6625\u8fd0" }
+ ]
+ },
+ {
+ "test": "CHARSET0004",
+ "received": [
+ "foo=\"\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c\""
+ ],
+ "sent": [
+ { "name": "foo", "value": "\"\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c\"" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0001",
+ "received": [
+ "a=b"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0002",
+ "received": [
+ "aBc=\"zzz \" ;"
+ ],
+ "sent": [
+ { "name": "aBc", "value": "\"zzz \"" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0003",
+ "received": [
+ "aBc=\"zzz \" ;"
+ ],
+ "sent": [
+ { "name": "aBc", "value": "\"zzz \"" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0004",
+ "received": [
+ "aBc=\"zz;pp\" ; ;"
+ ],
+ "sent": [
+ { "name": "aBc", "value": "\"zz" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0005",
+ "received": [
+ "aBc=\"zz ;"
+ ],
+ "sent": [
+ { "name": "aBc", "value": "\"zz" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0006",
+ "received": [
+ "aBc=\"zzz \" \"ppp\" ;"
+ ],
+ "sent": [
+ { "name": "aBc", "value": "\"zzz \" \"ppp\"" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0007",
+ "received": [
+ "aBc=\"zzz \" \"ppp\" ;"
+ ],
+ "sent": [
+ { "name": "aBc", "value": "\"zzz \" \"ppp\"" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0008",
+ "received": [
+ "aBc=A\"B ;"
+ ],
+ "sent": [
+ { "name": "aBc", "value": "A\"B" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0009",
+ "received": [
+ "BLAHHH; path=/;"
+ ],
+ "sent": []
+ },
+ {
+ "test": "CHROMIUM0010",
+ "received": [
+ "\"BLA\\\"HHH\"; path=/;"
+ ],
+ "sent": []
+ },
+ {
+ "test": "CHROMIUM0011",
+ "received": [
+ "a=\"B"
+ ],
+ "sent": [
+ { "name": "a", "value": "\"B" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0012",
+ "received": [
+ "=ABC"
+ ],
+ "sent": []
+ },
+ {
+ "test": "CHROMIUM0013",
+ "received": [
+ "ABC=; path = /"
+ ],
+ "sent": [
+ { "name": "ABC", "value": "" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0014",
+ "received": [
+ " A = BC ;foo;;; bar"
+ ],
+ "sent": [
+ { "name": "A", "value": "BC" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0015",
+ "received": [
+ " A=== BC ;foo;;; bar"
+ ],
+ "sent": [
+ { "name": "A", "value": "== BC" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0016",
+ "received": [
+ "foo=\"zohNumRKgI0oxyhSsV3Z7D\" ; expires=Sun, 18-Apr-2027 21:06:29 GMT ; path=/ ; "
+ ],
+ "sent": [
+ { "name": "foo", "value": "\"zohNumRKgI0oxyhSsV3Z7D\"" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0017",
+ "received": [
+ "foo=zohNumRKgI0oxyhSsV3Z7D ; expires=Sun, 18-Apr-2027 21:06:29 GMT ; path=/ ; "
+ ],
+ "sent": [
+ { "name": "foo", "value": "zohNumRKgI0oxyhSsV3Z7D" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0018",
+ "received": [
+ " "
+ ],
+ "sent": []
+ },
+ {
+ "test": "CHROMIUM0019",
+ "received": [
+ "a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ ],
+ "sent": [
+ { "name": "a", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }
+ ]
+ },
+ {
+ "test": "CHROMIUM0021",
+ "received": [
+ ""
+ ],
+ "sent": []
+ },
+ {
+ "test": "COMMA0001",
+ "received": [
+ "foo=bar, baz=qux"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar, baz=qux" }
+ ]
+ },
+ {
+ "test": "COMMA0002",
+ "received": [
+ "foo=\"bar, baz=qux\""
+ ],
+ "sent": [
+ { "name": "foo", "value": "\"bar, baz=qux\"" }
+ ]
+ },
+ {
+ "test": "COMMA0003",
+ "received": [
+ "foo=bar; b,az=qux"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "COMMA0004",
+ "received": [
+ "foo=bar; baz=q,ux"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "COMMA0005",
+ "received": [
+ "foo=bar; Max-Age=50,399"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "COMMA0006",
+ "received": [
+ "foo=bar; Expires=Fri, 07 Aug 2019 08:04:19 GMT"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "COMMA0007",
+ "received": [
+ "foo=bar; Expires=Fri 07 Aug 2019 08:04:19 GMT, baz=qux"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DISABLED_CHROMIUM0020",
+ "received": [
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ ],
+ "sent": []
+ },
+ {
+ "test": "DISABLED_CHROMIUM0022",
+ "received": [
+ "AAA=BB\u0000ZYX"
+ ],
+ "sent": [
+ { "name": "AAA", "value": "BB" }
+ ]
+ },
+ {
+ "test": "DISABLED_CHROMIUM0023",
+ "received": [
+ "AAA=BB\rZYX"
+ ],
+ "sent": [
+ { "name": "AAA", "value": "BB" }
+ ]
+ },
+ {
+ "test": "DISABLED_PATH0029",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/bar"
+ ],
+ "sent-to": "/cookie-parser-result/f%6Fo/bar?disabled-path0029",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0001",
+ "received": [
+ "foo=bar; domain=home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0001",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0002",
+ "received": [
+ "foo=bar; domain=home.example.org"
+ ],
+ "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0002",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0003",
+ "received": [
+ "foo=bar; domain=.home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0003",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0004",
+ "received": [
+ "foo=bar; domain=home.example.org"
+ ],
+ "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0004",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0005",
+ "received": [
+ "foo=bar; domain=.home.example.org"
+ ],
+ "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0005",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0006",
+ "received": [
+ "foo=bar; domain=.home.example.org"
+ ],
+ "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0006",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0007",
+ "received": [
+ "foo=bar; domain=sibling.example.org"
+ ],
+ "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0007",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0008",
+ "received": [
+ "foo=bar; domain=.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0008",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0009",
+ "received": [
+ "foo=bar; domain=example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0009",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0010",
+ "received": [
+ "foo=bar; domain=..home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0010",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0011",
+ "received": [
+ "foo=bar; domain=home..example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0011",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0012",
+ "received": [
+ "foo=bar; domain= .home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0012",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0013",
+ "received": [
+ "foo=bar; domain= . home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0013",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0014",
+ "received": [
+ "foo=bar; domain=home.example.org."
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0014",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0015",
+ "received": [
+ "foo=bar; domain=home.example.org.."
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0015",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0016",
+ "received": [
+ "foo=bar; domain=home.example.org ."
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0016",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0017",
+ "received": [
+ "foo=bar; domain=.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0017",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0018",
+ "received": [
+ "foo=bar; domain=.org."
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0018",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0019",
+ "received": [
+ "foo=bar; domain=home.example.org",
+ "foo2=bar2; domain=.home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0019",
+ "sent": [
+ { "name": "foo", "value": "bar" },
+ { "name": "foo2", "value": "bar2" }
+ ]
+ },
+ {
+ "test": "DOMAIN0020",
+ "received": [
+ "foo2=bar2; domain=.home.example.org",
+ "foo=bar; domain=home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0020",
+ "sent": [
+ { "name": "foo2", "value": "bar2" },
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0021",
+ "received": [
+ "foo=bar; domain=\"home.example.org\""
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0021",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0022",
+ "received": [
+ "foo=bar; domain=home.example.org",
+ "foo2=bar2; domain=.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0022",
+ "sent": [
+ { "name": "foo", "value": "bar" },
+ { "name": "foo2", "value": "bar2" }
+ ]
+ },
+ {
+ "test": "DOMAIN0023",
+ "received": [
+ "foo2=bar2; domain=.example.org",
+ "foo=bar; domain=home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0023",
+ "sent": [
+ { "name": "foo2", "value": "bar2" },
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0024",
+ "received": [
+ "foo=bar; domain=.example.org; domain=home.example.org"
+ ],
+ "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0024",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0025",
+ "received": [
+ "foo=bar; domain=home.example.org; domain=.example.org"
+ ],
+ "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0025",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0026",
+ "received": [
+ "foo=bar; domain=home.eXaMpLe.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0026",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0027",
+ "received": [
+ "foo=bar; domain=home.example.org:8888"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0027",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0028",
+ "received": [
+ "foo=bar; domain=subdomain.home.example.org"
+ ],
+ "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0028",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0029",
+ "received": [
+ "foo=bar"
+ ],
+ "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0029",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0031",
+ "received": [
+ "foo=bar; domain=home.example.org; domain=.example.org"
+ ],
+ "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0031",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0033",
+ "received": [
+ "foo=bar; domain=home.example.org"
+ ],
+ "sent-to": "http://hoMe.eXaMplE.org:8888/cookie-parser-result?domain0033",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0034",
+ "received": [
+ "foo=bar; domain=home.example.org; domain=home.example.com"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0034",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0035",
+ "received": [
+ "foo=bar; domain=home.example.com; domain=home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0035",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0036",
+ "received": [
+ "foo=bar; domain=home.example.org; domain=home.example.com; domain=home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0036",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0037",
+ "received": [
+ "foo=bar; domain=home.example.com; domain=home.example.org; domain=home.example.com"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0037",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0038",
+ "received": [
+ "foo=bar; domain=home.example.org; domain=home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0038",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0039",
+ "received": [
+ "foo=bar; domain=home.example.org; domain=example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0039",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0040",
+ "received": [
+ "foo=bar; domain=example.org; domain=home.example.org"
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0040",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "DOMAIN0041",
+ "received": [
+ "foo=bar; domain=.sibling.example.org"
+ ],
+ "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0041",
+ "sent": []
+ },
+ {
+ "test": "DOMAIN0042",
+ "received": [
+ "foo=bar; domain=.sibling.home.example.org"
+ ],
+ "sent-to": "http://sibling.home.example.org:8888/cookie-parser-result?domain0042",
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0001",
+ "received": [
+ "foo=bar; max-age=-1"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0002",
+ "received": [
+ "foo=bar; max-age=0"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0003",
+ "received": [
+ "foo=bar; expires=Thu, 10 Apr 1980 16:33:12 GMT"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0004",
+ "received": [
+ "foo=bar; max-age=60"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "MOZILLA0005",
+ "received": [
+ "foo=bar; max-age=-20"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0006",
+ "received": [
+ "foo=bar; max-age=60"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "MOZILLA0007",
+ "received": [
+ "foo=bar; expires=Thu, 10 Apr 1980 16:33:12 GMT"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0008",
+ "received": [
+ "foo=bar; max-age=60",
+ "foo1=bar; max-age=60"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" },
+ { "name": "foo1", "value": "bar" }
+ ]
+ },
+ {
+ "test": "MOZILLA0009",
+ "received": [
+ "foo=bar; max-age=60",
+ "foo1=bar; max-age=60",
+ "foo=differentvalue; max-age=0"
+ ],
+ "sent": [
+ { "name": "foo1", "value": "bar" }
+ ]
+ },
+ {
+ "test": "MOZILLA0010",
+ "received": [
+ "foo=bar; max-age=60",
+ "foo1=bar; max-age=60",
+ "foo=differentvalue; max-age=0",
+ "foo2=evendifferentvalue; max-age=0"
+ ],
+ "sent": [
+ { "name": "foo1", "value": "bar" }
+ ]
+ },
+ {
+ "test": "MOZILLA0011",
+ "received": [
+ "test=parser; domain=.parser.test; ;; ;=; ,,, ===,abc,=; abracadabra! max-age=20;=;;"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0012",
+ "received": [
+ "test=\"fubar! = foo;bar\\\";\" parser; max-age=6",
+ "five; max-age=2.63,"
+ ],
+ "sent": [
+ { "name": "test", "value": "\"fubar! = foo" }
+ ]
+ },
+ {
+ "test": "MOZILLA0013",
+ "received": [
+ "test=kill; max-age=0",
+ "five; max-age=0"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0014",
+ "received": [
+ "six"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0015",
+ "received": [
+ "six",
+ "seven"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0016",
+ "received": [
+ "six",
+ "seven",
+ " =eight"
+ ],
+ "sent": []
+ },
+ {
+ "test": "MOZILLA0017",
+ "received": [
+ "six",
+ "seven",
+ " =eight",
+ "test=six"
+ ],
+ "sent": [
+ { "name": "test", "value": "six" }
+ ]
+ },
+ {
+ "test": "NAME0001",
+ "received": [
+ "a=bar"
+ ],
+ "sent": [
+ { "name": "a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0002",
+ "received": [
+ "1=bar"
+ ],
+ "sent": [
+ { "name": "1", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0003",
+ "received": [
+ "$=bar"
+ ],
+ "sent": [
+ { "name": "$", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0004",
+ "received": [
+ "!a=bar"
+ ],
+ "sent": [
+ { "name": "!a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0005",
+ "received": [
+ "@a=bar"
+ ],
+ "sent": [
+ { "name": "@a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0006",
+ "received": [
+ "#a=bar"
+ ],
+ "sent": [
+ { "name": "#a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0007",
+ "received": [
+ "$a=bar"
+ ],
+ "sent": [
+ { "name": "$a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0008",
+ "received": [
+ "%a=bar"
+ ],
+ "sent": [
+ { "name": "%a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0009",
+ "received": [
+ "^a=bar"
+ ],
+ "sent": [
+ { "name": "^a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0010",
+ "received": [
+ "&a=bar"
+ ],
+ "sent": [
+ { "name": "&a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0011",
+ "received": [
+ "*a=bar"
+ ],
+ "sent": [
+ { "name": "*a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0012",
+ "received": [
+ "(a=bar"
+ ],
+ "sent": [
+ { "name": "(a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0013",
+ "received": [
+ ")a=bar"
+ ],
+ "sent": [
+ { "name": ")a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0014",
+ "received": [
+ "-a=bar"
+ ],
+ "sent": [
+ { "name": "-a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0015",
+ "received": [
+ "_a=bar"
+ ],
+ "sent": [
+ { "name": "_a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0016",
+ "received": [
+ "+=bar"
+ ],
+ "sent": [
+ { "name": "+", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0017",
+ "received": [
+ "=a=bar"
+ ],
+ "sent": []
+ },
+ {
+ "test": "NAME0018",
+ "received": [
+ "a =bar"
+ ],
+ "sent": [
+ { "name": "a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0019",
+ "received": [
+ "\"a=bar"
+ ],
+ "sent": [
+ { "name": "\"a", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0020",
+ "received": [
+ "\"a=b\"=bar"
+ ],
+ "sent": [
+ { "name": "\"a", "value": "b\"=bar" }
+ ]
+ },
+ {
+ "test": "NAME0021",
+ "received": [
+ "\"a=b\"=bar",
+ "\"a=qux"
+ ],
+ "sent": [
+ { "name": "\"a", "value": "qux" }
+ ]
+ },
+ {
+ "test": "NAME0022",
+ "received": [
+ " foo=bar"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0023",
+ "received": [
+ "foo;bar=baz"
+ ],
+ "sent": []
+ },
+ {
+ "test": "NAME0024",
+ "received": [
+ "$Version=1; foo=bar"
+ ],
+ "sent": [
+ { "name": "$Version", "value": "1" }
+ ]
+ },
+ {
+ "test": "NAME0025",
+ "received": [
+ "===a=bar"
+ ],
+ "sent": []
+ },
+ {
+ "test": "NAME0026",
+ "received": [
+ "foo=bar "
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0027",
+ "received": [
+ "foo=bar ;"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "NAME0028",
+ "received": [
+ "=a"
+ ],
+ "sent": []
+ },
+ {
+ "test": "NAME0029",
+ "received": [
+ "="
+ ],
+ "sent": []
+ },
+ {
+ "test": "NAME0030",
+ "received": [
+ "foo bar=baz"
+ ],
+ "sent": [
+ { "name": "foo bar", "value": "baz" }
+ ]
+ },
+ {
+ "test": "NAME0031",
+ "received": [
+ "\"foo;bar\"=baz"
+ ],
+ "sent": []
+ },
+ {
+ "test": "NAME0032",
+ "received": [
+ "\"foo\\\"bar;baz\"=qux"
+ ],
+ "sent": []
+ },
+ {
+ "test": "NAME0033",
+ "received": [
+ "=foo=bar",
+ "aaa"
+ ],
+ "sent": []
+ },
+ {
+ "test": "OPTIONAL_DOMAIN0030",
+ "received": [
+ "foo=bar; domain="
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0030",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "OPTIONAL_DOMAIN0041",
+ "received": [
+ "foo=bar; domain=example.org; domain="
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0041",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "OPTIONAL_DOMAIN0042",
+ "received": [
+ "foo=bar; domain=foo.example.org; domain="
+ ],
+ "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0042",
+ "sent": []
+ },
+ {
+ "test": "OPTIONAL_DOMAIN0043",
+ "received": [
+ "foo=bar; domain=foo.example.org; domain="
+ ],
+ "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?optional-domain0043",
+ "sent": []
+ },
+ {
+ "test": "ORDERING0001",
+ "received": [
+ "key=val0;",
+ "key=val1; path=/cookie-parser-result",
+ "key=val2; path=/",
+ "key=val3; path=/bar",
+ "key=val4; domain=.example.org",
+ "key=val5; domain=.example.org; path=/cookie-parser-result/foo"
+ ],
+ "sent-to": "/cookie-parser-result/foo/baz?ordering0001",
+ "sent": [
+ { "name": "key", "value": "val5" },
+ { "name": "key", "value": "val1" },
+ { "name": "key", "value": "val2" },
+ { "name": "key", "value": "val4" }
+ ]
+ },
+ {
+ "test": "PATH0001",
+ "received": [
+ "a=b; path=/",
+ "x=y; path=/cookie-parser-result"
+ ],
+ "sent": [
+ { "name": "x", "value": "y" },
+ { "name": "a", "value": "b" }
+ ]
+ },
+ {
+ "test": "PATH0002",
+ "received": [
+ "a=b; path=/cookie-parser-result",
+ "x=y; path=/"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" },
+ { "name": "x", "value": "y" }
+ ]
+ },
+ {
+ "test": "PATH0003",
+ "received": [
+ "x=y; path=/",
+ "a=b; path=/cookie-parser-result"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" },
+ { "name": "x", "value": "y" }
+ ]
+ },
+ {
+ "test": "PATH0004",
+ "received": [
+ "x=y; path=/cookie-parser-result",
+ "a=b; path=/"
+ ],
+ "sent": [
+ { "name": "x", "value": "y" },
+ { "name": "a", "value": "b" }
+ ]
+ },
+ {
+ "test": "PATH0005",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo"
+ ],
+ "sent": []
+ },
+ {
+ "test": "PATH0006",
+ "received": [
+ "foo=bar",
+ "foo=qux; path=/cookie-parser-result/foo"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0007",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo"
+ ],
+ "sent-to": "/cookie-parser-result/foo?path0007",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0008",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo"
+ ],
+ "sent-to": "/cookie-parser-result/bar?path0008",
+ "sent": []
+ },
+ {
+ "test": "PATH0009",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux"
+ ],
+ "sent-to": "/cookie-parser-result/foo?path0009",
+ "sent": []
+ },
+ {
+ "test": "PATH0010",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux"
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux?path0010",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0011",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux"
+ ],
+ "sent-to": "/cookie-parser-result/bar/qux?path0011",
+ "sent": []
+ },
+ {
+ "test": "PATH0012",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux"
+ ],
+ "sent-to": "/cookie-parser-result/foo/baz?path0012",
+ "sent": []
+ },
+ {
+ "test": "PATH0013",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux/"
+ ],
+ "sent-to": "/cookie-parser-result/foo/baz?path0013",
+ "sent": []
+ },
+ {
+ "test": "PATH0014",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux/"
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux?path0014",
+ "sent": []
+ },
+ {
+ "test": "PATH0015",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux/"
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux/?path0015",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0016",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/"
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux?path0016",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0017",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/"
+ ],
+ "sent-to": "/cookie-parser-result/foo//qux?path0017",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0018",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/"
+ ],
+ "sent-to": "/cookie-parser-result/fooqux?path0018",
+ "sent": []
+ },
+ {
+ "test": "PATH0019",
+ "received": [
+ "foo=bar; path"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0020",
+ "received": [
+ "foo=bar; path="
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0021",
+ "received": [
+ "foo=bar; path=/"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0022",
+ "received": [
+ "foo=bar; path= /"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0023",
+ "received": [
+ "foo=bar; Path=/cookie-PARSER-result"
+ ],
+ "sent": []
+ },
+ {
+ "test": "PATH0024",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux?"
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux?path0024",
+ "sent": []
+ },
+ {
+ "test": "PATH0025",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux#"
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux?path0025",
+ "sent": []
+ },
+ {
+ "test": "PATH0026",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/foo/qux;"
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux?path0026",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0027",
+ "received": [
+ "foo=bar; path=\"/cookie-parser-result/foo/qux;\""
+ ],
+ "sent-to": "/cookie-parser-result/foo/qux?path0027",
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0028",
+ "received": [
+ "foo=bar; path=/cookie-parser-result/f%6Fo/bar"
+ ],
+ "sent-to": "/cookie-parser-result/foo/bar?path0028",
+ "sent": []
+ },
+ {
+ "test": "PATH0029",
+ "received": [
+ "a=b; \tpath\t=\t/cookie-parser-result\t",
+ "x=y; \tpath\t=\t/book\t"
+ ],
+ "sent": [
+ { "name": "a", "value": "b" }
+ ]
+ },
+ {
+ "test": "PATH0030",
+ "received": [
+ "foo=bar; path=/dog; path="
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "PATH0031",
+ "received": [
+ "foo=bar; path=; path=/dog"
+ ],
+ "sent": []
+ },
+ {
+ "test": "PATH0032",
+ "received": [
+ "foo=bar; path=/cookie-parser-result",
+ "foo=qux; path=/cookie-parser-result/"
+ ],
+ "sent-to": "/cookie-parser-result/dog?path0032",
+ "sent": [
+ { "name": "foo", "value": "qux" },
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "VALUE0001",
+ "received": [
+ "foo= bar"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ },
+ {
+ "test": "VALUE0002",
+ "received": [
+ "foo=\"bar\""
+ ],
+ "sent": [
+ { "name": "foo", "value": "\"bar\"" }
+ ]
+ },
+ {
+ "test": "VALUE0003",
+ "received": [
+ "foo=\" bar \""
+ ],
+ "sent": [
+ { "name": "foo", "value": "\" bar \"" }
+ ]
+ },
+ {
+ "test": "VALUE0004",
+ "received": [
+ "foo=\"bar;baz\""
+ ],
+ "sent": [
+ { "name": "foo", "value": "\"bar" }
+ ]
+ },
+ {
+ "test": "VALUE0005",
+ "received": [
+ "foo=\"bar=baz\""
+ ],
+ "sent": [
+ { "name": "foo", "value": "\"bar=baz\"" }
+ ]
+ },
+ {
+ "test": "VALUE0006",
+ "received": [
+ "\tfoo\t=\tbar\t \t;\tttt"
+ ],
+ "sent": [
+ { "name": "foo", "value": "bar" }
+ ]
+ }
+]
diff --git a/node_modules/request/node_modules/tough-cookie/test/ietf_test.js b/node_modules/request/node_modules/tough-cookie/test/ietf_test.js
new file mode 100644
index 000000000..fac2e3eff
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/ietf_test.js
@@ -0,0 +1,106 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var fs = require('fs');
+var path = require('path');
+var url = require('url');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+var CookieJar = tough.CookieJar;
+
+function readJson(filePath) {
+ filePath = path.join(__dirname, filePath);
+ return JSON.parse(fs.readFileSync(filePath).toString());
+}
+
+function setGetCookieVows() {
+ var theVows = {};
+ var data = readJson('./ietf_data/parser.json');
+
+ data.forEach(function (testCase) {
+ theVows[testCase.test] = function () {
+ var jar = new CookieJar();
+ var expected = testCase['sent']
+ var sentFrom = 'http://home.example.org/cookie-parser?' + testCase.test;
+ var sentTo = testCase['sent-to'] ?
+ url.resolve('http://home.example.org', testCase['sent-to']) :
+ 'http://home.example.org/cookie-parser-result?' + testCase.test;
+
+ testCase['received'].forEach(function (cookieStr) {
+ jar.setCookieSync(cookieStr, sentFrom, {ignoreError: true});
+ });
+
+ var actual = jar.getCookiesSync(sentTo);
+ actual = actual.sort(tough.cookieCompare);
+
+ assert.strictEqual(actual.length, expected.length);
+
+ actual.forEach(function (actualCookie, idx) {
+ var expectedCookie = expected[idx];
+ assert.strictEqual(actualCookie.key, expectedCookie.name);
+ assert.strictEqual(actualCookie.value, expectedCookie.value);
+ });
+ };
+ });
+
+ return {'Set/get cookie tests': theVows};
+}
+
+function dateVows() {
+ var theVows = {};
+
+ [
+ './ietf_data/dates/bsd-examples.json',
+ './ietf_data/dates/examples.json'
+ ].forEach(function (filePath) {
+ var data = readJson(filePath);
+ var fileName = path.basename(filePath);
+
+ data.forEach(function (testCase) {
+ theVows[fileName + ' : ' + testCase.test] = function () {
+ var actual = tough.parseDate(testCase.test);
+ actual = actual ? actual.toUTCString() : null;
+ assert.strictEqual(actual, testCase.expected);
+ };
+ });
+ });
+
+ return {'Date': theVows};
+}
+
+vows
+ .describe('IETF http state tests')
+ .addBatch(setGetCookieVows())
+ .addBatch(dateVows())
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/lifetime_test.js b/node_modules/request/node_modules/tough-cookie/test/lifetime_test.js
new file mode 100644
index 000000000..e66a22b26
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/lifetime_test.js
@@ -0,0 +1,97 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+
+vows
+ .describe('Lifetime')
+ .addBatch({
+ "TTL with max-age": function () {
+ var c = new Cookie();
+ c.maxAge = 123;
+ assert.equal(c.TTL(), 123000);
+ assert.equal(c.expiryTime(new Date(9000000)), 9123000);
+ },
+ "TTL with zero max-age": function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ c.maxAge = 0; // should be treated as "earliest representable"
+ assert.equal(c.TTL(), 0);
+ assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
+ assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
+ },
+ "TTL with negative max-age": function () {
+ var c = new Cookie();
+ c.key = 'a';
+ c.value = 'b';
+ c.maxAge = -1; // should be treated as "earliest representable"
+ assert.equal(c.TTL(), 0);
+ assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
+ assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
+ },
+ "TTL with max-age and expires": function () {
+ var c = new Cookie();
+ c.maxAge = 123;
+ c.expires = new Date(Date.now() + 9000);
+ assert.equal(c.TTL(), 123000);
+ assert.ok(c.isPersistent());
+ },
+ "TTL with expires": function () {
+ var c = new Cookie();
+ var now = Date.now();
+ c.expires = new Date(now + 9000);
+ assert.equal(c.TTL(now), 9000);
+ assert.equal(c.expiryTime(), c.expires.getTime());
+ },
+ "TTL with old expires": function () {
+ var c = new Cookie();
+ c.setExpires('17 Oct 2010 00:00:00 GMT');
+ assert.ok(c.TTL() < 0);
+ assert.ok(c.isPersistent());
+ },
+ "default TTL": {
+ topic: function () {
+ return new Cookie();
+ },
+ "is Infinite-future": function (c) {
+ assert.equal(c.TTL(), Infinity)
+ },
+ "is a 'session' cookie": function (c) {
+ assert.ok(!c.isPersistent())
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/parsing_test.js b/node_modules/request/node_modules/tough-cookie/test/parsing_test.js
new file mode 100644
index 000000000..cb37c6367
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/parsing_test.js
@@ -0,0 +1,294 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+
+vows
+ .describe('Parsing')
+ .addBatch({
+ "simple": {
+ topic: function() {
+ return Cookie.parse('a=bcd') || null;
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'a') },
+ "value": function(c) { assert.equal(c.value, 'bcd') },
+ "no path": function(c) { assert.equal(c.path, null) },
+ "no domain": function(c) { assert.equal(c.domain, null) },
+ "no extensions": function(c) { assert.ok(!c.extensions) }
+ },
+ "with expiry": {
+ topic: function() {
+ return Cookie.parse('a=bcd; Expires=Tue, 18 Oct 2011 07:05:03 GMT') || null;
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'a') },
+ "value": function(c) { assert.equal(c.value, 'bcd') },
+ "has expires": function(c) {
+ assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
+ assert.equal(c.expires.getTime(), 1318921503000);
+ }
+ },
+ "with expiry and path": {
+ topic: function() {
+ return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc') || null;
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'abc') },
+ "value": function(c) { assert.equal(c.value, '"xyzzy!"') },
+ "has expires": function(c) {
+ assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
+ assert.equal(c.expires.getTime(), 1318921503000);
+ },
+ "has path": function(c) { assert.equal(c.path, '/aBc'); },
+ "no httponly or secure": function(c) {
+ assert.ok(!c.httpOnly);
+ assert.ok(!c.secure);
+ }
+ },
+ "with everything": {
+ topic: function() {
+ return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc; Domain=example.com; Secure; HTTPOnly; Max-Age=1234; Foo=Bar; Baz') || null;
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'abc') },
+ "value": function(c) { assert.equal(c.value, '"xyzzy!"') },
+ "has expires": function(c) {
+ assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
+ assert.equal(c.expires.getTime(), 1318921503000);
+ },
+ "has path": function(c) { assert.equal(c.path, '/aBc'); },
+ "has domain": function(c) { assert.equal(c.domain, 'example.com'); },
+ "has httponly": function(c) { assert.equal(c.httpOnly, true); },
+ "has secure": function(c) { assert.equal(c.secure, true); },
+ "has max-age": function(c) { assert.equal(c.maxAge, 1234); },
+ "has extensions": function(c) {
+ assert.ok(c.extensions);
+ assert.equal(c.extensions[0], 'Foo=Bar');
+ assert.equal(c.extensions[1], 'Baz');
+ }
+ },
+ "invalid expires": function() {
+ var c = Cookie.parse("a=b; Expires=xyzzy");
+ assert.ok(c);
+ assert.equal(c.expires, Infinity);
+ },
+ "zero max-age": function() {
+ var c = Cookie.parse("a=b; Max-Age=0");
+ assert.ok(c);
+ assert.equal(c.maxAge, 0);
+ },
+ "negative max-age": function() {
+ var c = Cookie.parse("a=b; Max-Age=-1");
+ assert.ok(c);
+ assert.equal(c.maxAge, -1);
+ },
+ "empty domain": function() {
+ var c = Cookie.parse("a=b; domain=");
+ assert.ok(c);
+ assert.equal(c.domain, null);
+ },
+ "dot domain": function() {
+ var c = Cookie.parse("a=b; domain=.");
+ assert.ok(c);
+ assert.equal(c.domain, null);
+ },
+ "uppercase domain": function() {
+ var c = Cookie.parse("a=b; domain=EXAMPLE.COM");
+ assert.ok(c);
+ assert.equal(c.domain, 'example.com');
+ },
+ "trailing dot in domain": {
+ topic: function() {
+ return Cookie.parse("a=b; Domain=example.com.", true) || null;
+ },
+ "has the domain": function(c) { assert.equal(c.domain,"example.com.") },
+ "but doesn't validate": function(c) { assert.equal(c.validate(),false) }
+ },
+ "empty path": function() {
+ var c = Cookie.parse("a=b; path=");
+ assert.ok(c);
+ assert.equal(c.path, null);
+ },
+ "no-slash path": function() {
+ var c = Cookie.parse("a=b; path=xyzzy");
+ assert.ok(c);
+ assert.equal(c.path, null);
+ },
+ "trailing semi-colons after path": {
+ topic: function () {
+ return [
+ "a=b; path=/;",
+ "c=d;;;;"
+ ];
+ },
+ "strips semi-colons": function (t) {
+ var c1 = Cookie.parse(t[0]);
+ var c2 = Cookie.parse(t[1]);
+ assert.ok(c1);
+ assert.ok(c2);
+ assert.equal(c1.path, '/');
+ }
+ },
+ "secure-with-value": function() {
+ var c = Cookie.parse("a=b; Secure=xyzzy");
+ assert.ok(c);
+ assert.equal(c.secure, true);
+ },
+ "httponly-with-value": function() {
+ var c = Cookie.parse("a=b; HttpOnly=xyzzy");
+ assert.ok(c);
+ assert.equal(c.httpOnly, true);
+ },
+ "garbage": {
+ topic: function() {
+ return Cookie.parse("\x08", true) || null;
+ },
+ "doesn't parse": function(c) { assert.equal(c,null) }
+ },
+ "public suffix domain": {
+ topic: function() {
+ return Cookie.parse("a=b; domain=kyoto.jp", true) || null;
+ },
+ "parses fine": function(c) {
+ assert.ok(c);
+ assert.equal(c.domain, 'kyoto.jp');
+ },
+ "but fails validation": function(c) {
+ assert.ok(c);
+ assert.ok(!c.validate());
+ }
+ },
+ "public suffix foonet.net": {
+ "top level": {
+ topic: function() {
+ return Cookie.parse("a=b; domain=foonet.net") || null;
+ },
+ "parses and is valid": function(c) {
+ assert.ok(c);
+ assert.equal(c.domain, 'foonet.net');
+ assert.ok(c.validate());
+ }
+ },
+ "www": {
+ topic: function() {
+ return Cookie.parse("a=b; domain=www.foonet.net") || null;
+ },
+ "parses and is valid": function(c) {
+ assert.ok(c);
+ assert.equal(c.domain, 'www.foonet.net');
+ assert.ok(c.validate());
+ }
+ },
+ "with a dot": {
+ topic: function() {
+ return Cookie.parse("a=b; domain=.foonet.net") || null;
+ },
+ "parses and is valid": function(c) {
+ assert.ok(c);
+ assert.equal(c.domain, 'foonet.net');
+ assert.ok(c.validate());
+ }
+ }
+ },
+ "Ironically, Google 'GAPS' cookie has very little whitespace": {
+ topic: function() {
+ return Cookie.parse("GAPS=1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-;Path=/;Expires=Thu, 17-Apr-2014 02:12:29 GMT;Secure;HttpOnly");
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'GAPS') },
+ "value": function(c) { assert.equal(c.value, '1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-') },
+ "path": function(c) {
+ assert.notEqual(c.path, '/;Expires'); // BUG
+ assert.equal(c.path, '/');
+ },
+ "expires": function(c) {
+ assert.notEqual(c.expires, Infinity);
+ assert.equal(c.expires.getTime(), 1397700749000);
+ },
+ "secure": function(c) { assert.ok(c.secure) },
+ "httponly": function(c) { assert.ok(c.httpOnly) }
+ },
+ "lots of equal signs": {
+ topic: function() {
+ return Cookie.parse("queryPref=b=c&d=e; Path=/f=g; Expires=Thu, 17 Apr 2014 02:12:29 GMT; HttpOnly");
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'queryPref') },
+ "value": function(c) { assert.equal(c.value, 'b=c&d=e') },
+ "path": function(c) {
+ assert.equal(c.path, '/f=g');
+ },
+ "expires": function(c) {
+ assert.notEqual(c.expires, Infinity);
+ assert.equal(c.expires.getTime(), 1397700749000);
+ },
+ "httponly": function(c) { assert.ok(c.httpOnly) }
+ },
+ "spaces in value": {
+ topic: function() {
+ return Cookie.parse('a=one two three',false) || null;
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'a') },
+ "value": function(c) { assert.equal(c.value, 'one two three') },
+ "no path": function(c) { assert.equal(c.path, null) },
+ "no domain": function(c) { assert.equal(c.domain, null) },
+ "no extensions": function(c) { assert.ok(!c.extensions) }
+ },
+ "quoted spaces in value": {
+ topic: function() {
+ return Cookie.parse('a="one two three"',false) || null;
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'a') },
+ "value": function(c) { assert.equal(c.value, '"one two three"') },
+ "no path": function(c) { assert.equal(c.path, null) },
+ "no domain": function(c) { assert.equal(c.domain, null) },
+ "no extensions": function(c) { assert.ok(!c.extensions) }
+ },
+ "non-ASCII in value": {
+ topic: function() {
+ return Cookie.parse('farbe=weiß',false) || null;
+ },
+ "parsed": function(c) { assert.ok(c) },
+ "key": function(c) { assert.equal(c.key, 'farbe') },
+ "value": function(c) { assert.equal(c.value, 'weiß') },
+ "no path": function(c) { assert.equal(c.path, null) },
+ "no domain": function(c) { assert.equal(c.domain, null) },
+ "no extensions": function(c) { assert.ok(!c.extensions) }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tough-cookie/test/regression_test.js b/node_modules/request/node_modules/tough-cookie/test/regression_test.js
new file mode 100644
index 000000000..4edb60972
--- /dev/null
+++ b/node_modules/request/node_modules/tough-cookie/test/regression_test.js
@@ -0,0 +1,143 @@
+/*!
+ * 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 vows = require('vows');
+var assert = require('assert');
+var async = require('async');
+var tough = require('../lib/cookie');
+var Cookie = tough.Cookie;
+var CookieJar = tough.CookieJar;
+
+var atNow = Date.now();
+
+function at(offset) {
+ return {now: new Date(atNow + offset)};
+}
+
+vows
+ .describe('Regression tests')
+ .addBatch({
+ "Issue 1": {
+ topic: function () {
+ var cj = new CookieJar();
+ cj.setCookie('hello=world; path=/some/path/', 'http://domain/some/path/file', function (err, cookie) {
+ this.callback(err, {cj: cj, cookie: cookie});
+ }.bind(this));
+ },
+ "stored a cookie": function (t) {
+ assert.ok(t.cookie);
+ },
+ "getting it back": {
+ topic: function (t) {
+ t.cj.getCookies('http://domain/some/path/file', function (err, cookies) {
+ this.callback(err, {cj: t.cj, cookies: cookies || []});
+ }.bind(this));
+ },
+ "got one cookie": function (t) {
+ assert.lengthOf(t.cookies, 1);
+ },
+ "it's the right one": function (t) {
+ var c = t.cookies[0];
+ assert.equal(c.key, 'hello');
+ assert.equal(c.value, 'world');
+ }
+ }
+ }
+ })
+ .addBatch({
+ "trailing semi-colon set into cj": {
+ topic: function () {
+ var cb = this.callback;
+ var cj = new CookieJar();
+ var ex = 'http://www.example.com';
+ var tasks = [];
+ tasks.push(function (next) {
+ cj.setCookie('broken_path=testme; path=/;', ex, at(-1), next);
+ });
+ tasks.push(function (next) {
+ cj.setCookie('b=2; Path=/;;;;', ex, at(-1), next);
+ });
+ async.parallel(tasks, function (err, cookies) {
+ cb(null, {
+ cj: cj,
+ cookies: cookies
+ });
+ });
+ },
+ "check number of cookies": function (t) {
+ assert.lengthOf(t.cookies, 2, "didn't set");
+ },
+ "check *broken_path* was set properly": function (t) {
+ assert.equal(t.cookies[0].key, "broken_path");
+ assert.equal(t.cookies[0].value, "testme");
+ assert.equal(t.cookies[0].path, "/");
+ },
+ "check *b* was set properly": function (t) {
+ assert.equal(t.cookies[1].key, "b");
+ assert.equal(t.cookies[1].value, "2");
+ assert.equal(t.cookies[1].path, "/");
+ },
+ "retrieve the cookie": {
+ topic: function (t) {
+ var cb = this.callback;
+ t.cj.getCookies('http://www.example.com', {}, function (err, cookies) {
+ t.cookies = cookies;
+ cb(err, t);
+ });
+ },
+ "get the cookie": function (t) {
+ assert.lengthOf(t.cookies, 2);
+ assert.equal(t.cookies[0].key, 'broken_path');
+ assert.equal(t.cookies[0].value, 'testme');
+ assert.equal(t.cookies[1].key, "b");
+ assert.equal(t.cookies[1].value, "2");
+ assert.equal(t.cookies[1].path, "/");
+ }
+ }
+ }
+ })
+ .addBatch({
+ "tough-cookie throws exception on malformed URI (GH-32)": {
+ topic: function () {
+ var url = "http://www.example.com/?test=100%";
+ var cj = new CookieJar();
+
+ cj.setCookieSync("Test=Test", url);
+
+ return cj.getCookieStringSync(url);
+ },
+ "cookies are set": function (cookieStr) {
+ assert.strictEqual(cookieStr, "Test=Test");
+ }
+ }
+ })
+ .export(module);
diff --git a/node_modules/request/node_modules/tunnel-agent/package.json b/node_modules/request/node_modules/tunnel-agent/package.json
index 2a9e6ed3f..e2bc2f012 100644
--- a/node_modules/request/node_modules/tunnel-agent/package.json
+++ b/node_modules/request/node_modules/tunnel-agent/package.json
@@ -8,7 +8,7 @@
"description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.",
"version": "0.4.0",
"repository": {
- "url": "https://github.com/mikeal/tunnel-agent"
+ "url": "git+https://github.com/mikeal/tunnel-agent.git"
},
"main": "index.js",
"dependencies": {},
@@ -17,28 +17,14 @@
"engines": {
"node": "*"
},
+ "readme": "tunnel-agent\n============\n\nHTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.\n",
+ "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/mikeal/tunnel-agent/issues"
},
- "homepage": "https://github.com/mikeal/tunnel-agent",
+ "homepage": "https://github.com/mikeal/tunnel-agent#readme",
"_id": "tunnel-agent@0.4.0",
- "dist": {
- "shasum": "b1184e312ffbcf70b3b4c78e8c219de7ebb1c550",
- "tarball": "http://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz"
- },
- "_from": "tunnel-agent@>=0.4.0 <0.5.0",
- "_npmVersion": "1.3.21",
- "_npmUser": {
- "name": "mikeal",
- "email": "mikeal.rogers@gmail.com"
- },
- "maintainers": [
- {
- "name": "mikeal",
- "email": "mikeal.rogers@gmail.com"
- }
- ],
- "directories": {},
"_shasum": "b1184e312ffbcf70b3b4c78e8c219de7ebb1c550",
- "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz"
+ "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz",
+ "_from": "tunnel-agent@>=0.4.0 <0.5.0"
}
diff --git a/node_modules/request/package.json b/node_modules/request/package.json
index d0311c642..7b85d14d0 100644
--- a/node_modules/request/package.json
+++ b/node_modules/request/package.json
@@ -7,14 +7,14 @@
"util",
"utility"
],
- "version": "2.55.0",
+ "version": "2.56.0",
"author": {
"name": "Mikeal Rogers",
"email": "mikeal.rogers@gmail.com"
},
"repository": {
"type": "git",
- "url": "https://github.com/request/request.git"
+ "url": "git+https://github.com/request/request.git"
},
"bugs": {
"url": "http://github.com/request/request/issues"
@@ -26,23 +26,23 @@
"main": "index.js",
"dependencies": {
"bl": "~0.9.0",
- "caseless": "~0.9.0",
+ "caseless": "~0.10.0",
"forever-agent": "~0.6.0",
"form-data": "~0.2.0",
"json-stringify-safe": "~5.0.0",
"mime-types": "~2.0.1",
"node-uuid": "~1.4.0",
- "qs": "~2.4.0",
+ "qs": "~3.1.0",
"tunnel-agent": "~0.4.0",
"tough-cookie": ">=0.12.0",
- "http-signature": "~0.10.0",
- "oauth-sign": "~0.6.0",
+ "http-signature": "~0.11.0",
+ "oauth-sign": "~0.8.0",
"hawk": "~2.3.0",
"aws-sign2": "~0.5.0",
"stringstream": "~0.0.4",
- "combined-stream": "~0.0.5",
+ "combined-stream": "~1.0.1",
"isstream": "~0.1.1",
- "har-validator": "^1.4.0"
+ "har-validator": "^1.6.1"
},
"scripts": {
"test": "npm run lint && node node_modules/.bin/taper tests/test-*.js && npm run test-browser",
@@ -52,8 +52,9 @@
"devDependencies": {
"browserify": "~5.9.1",
"browserify-istanbul": "~0.1.3",
+ "buffer-equal": "0.0.1",
"coveralls": "~2.11.2",
- "eslint": "0.17.1",
+ "eslint": "0.18.0",
"function-bind": "~1.0.0",
"istanbul": "~0.3.2",
"karma": "~0.12.21",
@@ -68,12 +69,13 @@
"taper": "~0.4.0",
"bluebird": "~2.9.21"
},
- "gitHead": "b6000376387db12d0c2d7ed9ee87b0ba123e36dc",
- "homepage": "https://github.com/request/request",
- "_id": "request@2.55.0",
- "_shasum": "d75c1cdf679d76bb100f9bffe1fe551b5c24e93d",
- "_from": "request@>=2.55.0 <2.56.0",
- "_npmVersion": "1.4.28",
+ "gitHead": "dec45b11eb264a8100e8c43fa44817d62368f780",
+ "homepage": "https://github.com/request/request#readme",
+ "_id": "request@2.56.0",
+ "_shasum": "21a6bd9cfd6aff33a7749971ffac29e833fa28fe",
+ "_from": "request@>=2.56.0 <2.57.0",
+ "_npmVersion": "2.10.1",
+ "_nodeVersion": "0.12.4",
"_npmUser": {
"name": "simov",
"email": "simeonvelichkov@gmail.com"
@@ -97,9 +99,9 @@
}
],
"dist": {
- "shasum": "d75c1cdf679d76bb100f9bffe1fe551b5c24e93d",
- "tarball": "http://registry.npmjs.org/request/-/request-2.55.0.tgz"
+ "shasum": "21a6bd9cfd6aff33a7749971ffac29e833fa28fe",
+ "tarball": "http://registry.npmjs.org/request/-/request-2.56.0.tgz"
},
"directories": {},
- "_resolved": "https://registry.npmjs.org/request/-/request-2.55.0.tgz"
+ "_resolved": "https://registry.npmjs.org/request/-/request-2.56.0.tgz"
}
diff --git a/node_modules/request/request.js b/node_modules/request/request.js
index 5f8f26844..ab7c3278a 100644
--- a/node_modules/request/request.js
+++ b/node_modules/request/request.js
@@ -5,8 +5,6 @@ var http = require('http')
, url = require('url')
, util = require('util')
, stream = require('stream')
- , qs = require('qs')
- , querystring = require('querystring')
, zlib = require('zlib')
, helpers = require('./lib/helpers')
, bl = require('bl')
@@ -22,6 +20,7 @@ var http = require('http')
, cookies = require('./lib/cookies')
, copy = require('./lib/copy')
, getProxyFromURI = require('./lib/getProxyFromURI')
+ , Querystring = require('./lib/querystring').Querystring
, Har = require('./lib/har').Har
, Auth = require('./lib/auth').Auth
, OAuth = require('./lib/oauth').OAuth
@@ -229,13 +228,6 @@ function responseToJSON() {
}
}
-// encode rfc3986 characters
-function rfc3986 (str) {
- return str.replace(/[!'()*]/g, function(c) {
- return '%' + c.charCodeAt(0).toString(16).toUpperCase()
- })
-}
-
function Request (options) {
// if given the method property in options, set property explicitMethod to true
@@ -265,6 +257,7 @@ function Request (options) {
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)
@@ -281,6 +274,7 @@ function debug() {
console.error('REQUEST %s', util.format.apply(util, arguments))
}
}
+Request.prototype.debug = debug
Request.prototype.setupTunnel = function () {
var self = this
@@ -340,15 +334,7 @@ Request.prototype.init = function (options) {
self.localAddress = options.localAddress
}
- if (!self.qsLib) {
- self.qsLib = (options.useQuerystring ? querystring : qs)
- }
- if (!self.qsParseOptions) {
- self.qsParseOptions = options.qsParseOptions
- }
- if (!self.qsStringifyOptions) {
- self.qsStringifyOptions = options.qsStringifyOptions
- }
+ self._qs.init(options)
debug(options)
if (!self.pool && self.pool !== false) {
@@ -409,13 +395,13 @@ Request.prototype.init = function (options) {
delete self.baseUrl
}
- // A URI is needed by this point, throw if we haven't been able to get one
+ // 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') {
+ if (typeof self.uri === 'string') {
self.uri = url.parse(self.uri)
}
@@ -425,7 +411,7 @@ Request.prototype.init = function (options) {
}
// Support Unix Sockets
- if(self.uri.host === 'unix') {
+ if (self.uri.host === 'unix') {
// Get the socket & request paths from the URL
var unixParts = self.uri.path.split(':')
, host = unixParts[0]
@@ -443,15 +429,6 @@ Request.prototype.init = function (options) {
self.rejectUnauthorized = false
}
- if(!self.hasOwnProperty('proxy')) {
- self.proxy = getProxyFromURI(self.uri)
- }
-
- self.tunnel = getTunnelOption(self, options)
- if (self.proxy) {
- self.setupTunnel()
- }
-
if (!self.uri.pathname) {self.uri.pathname = '/'}
if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) {
@@ -469,7 +446,16 @@ Request.prototype.init = function (options) {
return self.emit('error', new Error(message))
}
- self._redirect.onRequest()
+ if (!self.hasOwnProperty('proxy')) {
+ self.proxy = getProxyFromURI(self.uri)
+ }
+
+ self.tunnel = getTunnelOption(self, options)
+ if (self.proxy) {
+ self.setupTunnel()
+ }
+
+ self._redirect.onRequest(options)
self.setHost = false
if (!self.hasHeader('host')) {
@@ -542,10 +528,6 @@ Request.prototype.init = function (options) {
}
// Auth must happen last in case signing is dependent on other headers
- if (options.oauth) {
- self.oauth(options.oauth)
- }
-
if (options.aws) {
self.aws(options.aws)
}
@@ -579,14 +561,12 @@ Request.prototype.init = function (options) {
}
if (self.uri.auth && !self.hasHeader('authorization')) {
- var uriAuthPieces = self.uri.auth.split(':').map(function(item){ return querystring.unescape(item) })
+ 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 querystring.unescape(item)
- })
+ 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)
}
@@ -626,10 +606,16 @@ Request.prototype.init = function (options) {
self.setHeader('content-length', length)
}
} else {
- throw new Error('Argument error, options.body.')
+ self.emit('error', new Error('Argument error, options.body.'))
}
}
+ 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
, defaultModules = {'http:':http, 'https:':https}
, httpModules = self.httpModules || {}
@@ -666,7 +652,7 @@ Request.prototype.init = function (options) {
self.on('pipe', function (src) {
if (self.ntick && self._started) {
- throw new Error('You cannot pipe to this stream after the outbound request has started.')
+ self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.'))
}
self.src = src
if (isReadStream(src)) {
@@ -1047,12 +1033,6 @@ Request.prototype.onRequestResponse = function (response) {
response.resume()
return
}
- if (self._paused) {
- response.pause()
- } else if (response.resume) {
- // response.resume should be defined, but check anyway before calling. Workaround for browserify.
- response.resume()
- }
self.response = response
response.request = self
@@ -1120,56 +1100,62 @@ Request.prototype.onRequestResponse = function (response) {
self._ended = true
})
- var dataStream
+ var responseContent
if (self.gzip) {
var contentEncoding = response.headers['content-encoding'] || 'identity'
contentEncoding = contentEncoding.trim().toLowerCase()
if (contentEncoding === 'gzip') {
- dataStream = zlib.createGunzip()
- response.pipe(dataStream)
+ responseContent = zlib.createGunzip()
+ 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)
}
- dataStream = response
+ responseContent = response
}
} else {
- dataStream = response
+ 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 if (dataStream.setEncoding) {
- dataStream.setEncoding(self.encoding)
+ } else if (responseContent.setEncoding) {
+ responseContent.setEncoding(self.encoding)
} else {
// Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with
// zlib streams.
// If/When support for 0.9.4 is dropped, this should be unnecessary.
- dataStream = dataStream.pipe(stringstream(self.encoding))
+ responseContent = responseContent.pipe(stringstream(self.encoding))
}
}
+ if (self._paused) {
+ responseContent.pause()
+ }
+
+ self.responseContent = responseContent
+
self.emit('response', response)
self.dests.forEach(function (dest) {
self.pipeDest(dest)
})
- dataStream.on('data', function (chunk) {
+ responseContent.on('data', function (chunk) {
self._destdata = true
self.emit('data', chunk)
})
- dataStream.on('end', function (chunk) {
+ responseContent.on('end', function (chunk) {
self.emit('end', chunk)
})
- dataStream.on('error', function (error) {
+ responseContent.on('error', function (error) {
self.emit('error', error)
})
- dataStream.on('close', function () {self.emit('close')})
+ responseContent.on('close', function () {self.emit('close')})
if (self.callback) {
var buffer = bl()
@@ -1210,17 +1196,19 @@ Request.prototype.onRequestResponse = function (response) {
if (self._json) {
try {
response.body = JSON.parse(response.body, self._jsonReviver)
- } catch (e) {}
+ } catch (e) {
+ // empty
+ }
}
debug('emitting complete', self.uri.href)
- if(typeof response.body === 'undefined' && !self._json) {
+ if (typeof response.body === 'undefined' && !self._json) {
response.body = self.encoding === null ? new Buffer(0) : ''
}
self.emit('complete', response, response.body)
})
}
//if no callback
- else{
+ else {
self.on('end', function () {
if (self._aborted) {
debug('aborted', self.uri.href)
@@ -1290,7 +1278,7 @@ Request.prototype.qs = function (q, clobber) {
var self = this
var base
if (!clobber && self.uri.query) {
- base = self.qsLib.parse(self.uri.query, self.qsParseOptions)
+ base = self._qs.parse(self.uri.query)
} else {
base = {}
}
@@ -1299,13 +1287,13 @@ Request.prototype.qs = function (q, clobber) {
base[i] = q[i]
}
- if (self.qsLib.stringify(base, self.qsStringifyOptions) === ''){
+ if (self._qs.stringify(base) === '') {
return self
}
- var qs = self.qsLib.stringify(base, self.qsStringifyOptions)
+ var qs = self._qs.stringify(base)
- self.uri = url.parse(self.uri.href.split('?')[0] + '?' + rfc3986(qs))
+ self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs)
self.url = self.uri
self.path = self.uri.path
@@ -1316,9 +1304,8 @@ Request.prototype.form = function (form) {
if (form) {
self.setHeader('content-type', 'application/x-www-form-urlencoded')
self.body = (typeof form === 'string')
- ? form.toString('utf8')
- : self.qsLib.stringify(form, self.qsStringifyOptions).toString('utf8')
- self.body = rfc3986(self.body)
+ ? self._qs.rfc3986(form.toString('utf8'))
+ : self._qs.stringify(form).toString('utf8')
return self
}
// create form-data object
@@ -1354,7 +1341,7 @@ Request.prototype.json = function (val) {
if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) {
self.body = safeStringify(self.body)
} else {
- self.body = rfc3986(self.body)
+ self.body = self._qs.rfc3986(self.body)
}
if (!self.hasHeader('content-type')) {
self.setHeader('content-type', 'application/json')
@@ -1501,9 +1488,9 @@ Request.prototype.pipe = function (dest, opts) {
if (self.response) {
if (self._destdata) {
- throw new Error('You cannot pipe after data has been emitted from the response.')
+ self.emit('error', new Error('You cannot pipe after data has been emitted from the response.'))
} else if (self._ended) {
- throw new Error('You cannot pipe after the response has been 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)
@@ -1534,18 +1521,18 @@ Request.prototype.end = function (chunk) {
}
Request.prototype.pause = function () {
var self = this
- if (!self.response) {
+ if (!self.responseContent) {
self._paused = true
} else {
- self.response.pause.apply(self.response, arguments)
+ self.responseContent.pause.apply(self.responseContent, arguments)
}
}
Request.prototype.resume = function () {
var self = this
- if (!self.response) {
+ if (!self.responseContent) {
self._paused = false
} else {
- self.response.resume.apply(self.response, arguments)
+ self.responseContent.resume.apply(self.responseContent, arguments)
}
}
Request.prototype.destroy = function () {