imagezz 0.0.1-security → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of imagezz might be problematic. Click here for more details.
- package/.npm/_cacache/content-v2/sha512/08/06/e7afa473e0261090b614b52357c503d41f680af1fde259ec5596c9cc783f868e5b10d17b32d5c397fa637776dc58a26472db50a23b353c521c3a3b09dc11 +0 -0
- package/.npm/_cacache/content-v2/sha512/0c/71/07a81c35d9e1c8efe108e418321223f1555870c019bc030979280540aef641027cbf5757a529d823fd8ba899f9fc1fce9b4faf89286d30fc0f885a958741 +1 -0
- package/.npm/_cacache/content-v2/sha512/0f/b3/2d943476a4578affb0773fec9f47dc553c36c8e25699a5eb28acb751d9d52811d49a9672042bac2bbd1bbb477da7c1441df8f04b6e17012963bca98773c6 +1 -0
- package/.npm/_cacache/content-v2/sha512/11/f9/5b5e282abff4a7eceb3b64e14abbe16422ed6b0074161d4cdc2f73a9f08c462449628999948db5092d03cef623461a27320bfa47b8f3df8ca47f9072f793 +1 -0
- package/.npm/_cacache/content-v2/sha512/13/f6/6c754e072ecffaf206338064e43227164cb3dd01fb492df24594b50000a646912b4d53bdac6634fae929cc0d539f39663f600a220fb2716bd887be781c6a +0 -0
- package/.npm/_cacache/content-v2/sha512/14/2a/e898180b49206dc8a88c0c23561b0b02b780290f90470f16736d833c48290dfa5d05ac0dd3df6f8f166fdf06247089cfdda58d14dbdd64a9448efdc6445b +1 -0
- package/.npm/_cacache/content-v2/sha512/15/03/783117ee25e1dfedc05b04c2455e12920eafb690002b06599106f72f144e410751d9297b5214048385d973f73398c3187c943767be630e7bffb971da0476 +0 -0
- package/.npm/_cacache/content-v2/sha512/1c/cf/1efbb8a2da2219879444f0dff7c031c0602bf7c0d31845e988120444110ed41e6d9fecc39e6841071ef7bf9c7733559b75c687cd81c5b2fa7742b8efdcfb +1 -0
- package/.npm/_cacache/content-v2/sha512/1d/f3/038f83105b966503ecf21cda87547656cbc37f366b0da7b85ac6c93456df1a483a6606d81be6828b61dc54fef9084e4ad5ece4a312cf9ca5057c7080465a +1 -0
- package/.npm/_cacache/content-v2/sha512/1e/34/83470ea0644e4932081cb4705c8d56a4d3cf8a1158522220f31674fd4bd69e826a7ce52fdb45e0554dbe104c5691369b49f64b9868d8676cd10e91b29bfc +0 -0
- package/.npm/_cacache/content-v2/sha512/1f/ce/7e184e8acb52343bd9b81b0d9e4d83466a1065c88092002478a6156201a581aa9e0bb7b141d7149d4e14f998f78076dcb5377103a8038e09d81065183f1a +1 -0
- package/.npm/_cacache/content-v2/sha512/24/82/08ded6aa4399e21b553a2ab89520de128f3dd75815f1a6538aab5b00f3ac8394fc64c86e4b281bf095b9ddc51c5d55c482bb9a3083b4dd3c8e7d20203c6f +1 -0
- package/.npm/_cacache/content-v2/sha512/26/af/2182d680d289d47759ce07e7739bf555bf5873e15c5f8ba631e0bfa7725d70f5dca462582a1a1701971e37e00a634d908d2d444d768a967e405aa5b4218c +1 -0
- package/.npm/_cacache/content-v2/sha512/29/75/c515d01b15763881e148c28c8d2be7f96756fbb307d70017cbec75c29a821630a5377664b6ebaef603811e42d0f32cacbb49799f06ee7526896f10ac2d18 +0 -0
- package/.npm/_cacache/content-v2/sha512/2a/39/ee78f9ee068b3d889027bc74c7088c219de38a39219aa34121c31f20c73203081f701dcd5d72efbc6bc38520128b9ee718b0a048ff093a45915c6ff220f5 +1 -0
- package/.npm/_cacache/content-v2/sha512/2c/47/8e46ef521098520cca41c9073e5b8abfc834b79301f8022549d84f1f18973d020c2ae7ff89240617e9fd38b30bbb7860dfb3995d8a52639ebb78513df433 +1 -0
- package/.npm/_cacache/content-v2/sha512/2d/71/6fd8a878ad5ea9b025ff6a2d33563a2c079af4c9f38246447e1109a69409aed0918de98b24e2bd2b56051500464d9527c6b47728394121f9885723e96cb4 +0 -0
- package/.npm/_cacache/content-v2/sha512/31/c9/cd895d65f1161e63cb41804a6ea1d082d662d475b48df826012fb909b093489ce3fc5230c3130764e8cc3ad2f74b2ebaf934729984c00e4ab476359b90fb +0 -0
- package/.npm/_cacache/content-v2/sha512/32/cb/ed3ab7c6f5972b3b0016f908be17a1db0f40965c487da2eefbb8e6fb14cd963e1c13eec98cf37dcfcda9e124bb205e337cf48afa5763dccd7367329c0a87 +0 -0
- package/.npm/_cacache/content-v2/sha512/35/f2/7853304271018b0e542aee71f11feb6fde4c99d211d0a85e413ba27bb4d25e3f9768d6594fafc759f331e89df840bb43c701d3244a8fbca34c3183d9595b +0 -0
- package/.npm/_cacache/content-v2/sha512/38/91/424eab51c0557a06f8d77c1bb0fe1f04cc26535bf4cd87ca8399648b86b61ed29637b3968d4a76d39d832a040372de115f552c51e14636bbd02065c5a333 +1 -0
- package/.npm/_cacache/content-v2/sha512/39/e8/bd387e2d461d18a94dc6c615fbf5d33f9b0560bdb64969235a464f9bb21923d12e5c7c772061a92b7818eb1f06ad5ca6f3f88a087582f1aca8a6d8c8d6d1 +0 -0
- package/.npm/_cacache/content-v2/sha512/3a/a9/6ecface1197f1cc9169342514c3f0f346d22551b6c7f7056fc64f85420b1a01e46bd4aca24082390829bde78f7abaa27593ab4f5e22a6a7c96fb20b716e5 +0 -0
- package/.npm/_cacache/content-v2/sha512/3b/c4/2db4a43743f57483d4142fca7e00966927c1693586aec44ae6d9b66fa0289781bf34e129badccf0161f9a88d543b67553095d65f93f621ebc946d0deb7b0 +1 -0
- package/.npm/_cacache/content-v2/sha512/3f/66/d238c01cfdc88bcfa0f38235651893fdf81ac95aee540c62bbd02da2c1e0b940121e15fd195d1bc68c48f6b9882b63632400086c4961c35a516d12ba195b +0 -0
- package/.npm/_cacache/content-v2/sha512/3f/a2/0c4108cadd3b61646bacd217e41ff4f0731b4061fcfb8f9d8709563d2f97813724099870d918acae14cd1afdc7d265c4e12320e0f49bdbcadef14c92b821 +1 -0
- package/.npm/_cacache/content-v2/sha512/3f/a5/9d5fa9b327bf3055c681006056ef7a466d3532cba6aa20b5aaac63b5e081bc214ea14a1f8b3cd02b4e13eb46bc9771b9c4093146bc7c5956ca034d1af548 +0 -0
- package/.npm/_cacache/content-v2/sha512/40/39/bea4133081d25703c641c015c97f1be075af6e9fe4af9339a1c1844f8f4036298ec2eb660f1b532ed90d0d2a22ff83001343feb86d2bea8e9f83cb5a41dd +0 -0
- package/.npm/_cacache/content-v2/sha512/49/68/56d2983b1787d64bc3729b6d909b4a0d0380dd82462856498d573010dc31070da13379b79d5bd861e128e2e56e90ad35c0d117a0f07f9688215854a86192 +1 -0
- package/.npm/_cacache/content-v2/sha512/4c/a3/df1d7c13ebbb7fa4b22aa9aa099c7562b568e08a1e2e2895d73d58919ce041058c9a497484406f1ff2c7c94114bc1f0d01bed2a4ef15d5244e7af1d66d2a +1 -0
- package/.npm/_cacache/content-v2/sha512/4e/57/b273f11adeedd214afaa53ba545ebc20865173bb601d2f6039b3592dfaa7ff8d88f549de5bc3d80d349c252d2d370fa100538bf2ac0fa7c6b1564526fc75 +1 -0
- package/.npm/_cacache/content-v2/sha512/4e/6a/01d0b29f8ebc663a29fca87005ae4698d24f5a04923d8917ba48164922ff3733b1cc7f1337221c1cb339a6f4257e24c8dc931268ec8710e9ef356a0c9d53 +1 -0
- package/.npm/_cacache/content-v2/sha512/4e/ce/d9ecc7719152d0ef4d1816f44e0617745e56e30de3ae8dd7d89a32f7f2cb66fdcd08c15490ec363ea36137f66719ee93add9b8fd56d53ce80653a7582136 +1 -0
- package/.npm/_cacache/content-v2/sha512/51/55/3d7626ead897055b140f03a282aa3e4ee3654e980637cd051f10ac54d0aa53197c0da028e45f57b5dde1cdbf0ff13f29edea9534ad9d61b63593353497b2 +0 -0
- package/.npm/_cacache/content-v2/sha512/5b/db/f7b75e81f9a5a468edf254e900634ecfb46c3dc01a10fcf822318047da15b4657a69151b6c9d92139a9fc8b1496ad3645ff27da8ceec4e933d6bf2b36861 +1 -0
- package/.npm/_cacache/content-v2/sha512/61/9a/372bcd920fb462ca2d04d4440fa232f3ee4a5ea6749023d2323db1c78355d75debdbe5d248eeda72376003c467106c71bbbdcc911e4d1c6f0a9c42b894b6 +0 -0
- package/.npm/_cacache/content-v2/sha512/62/58/f3edf7f23dbacba4b9e0accb59ecd76e52056f8bac06f5127d21473209de7d610f75d4f049a6138351c6ce55ba987f17b5c2e61ffcb27c3dab8c470b0cfe +0 -0
- package/.npm/_cacache/content-v2/sha512/63/52/0a79904c73fd9f00131d64fed86660072f032096018d9d1df3df4a2ece1b1d0ed6655734b4cc002592047b6f49169e1e5580576e03df4e1e236b9565ba62 +1 -0
- package/.npm/_cacache/content-v2/sha512/64/29/60e80698bda9af60413cd9ddc8c9ddef49222343ea1d823693cd1b8edeceeda0274529cce86f68b4cc287b244f245a7d7bcaf016854571bea1b051a96c44 +0 -0
- package/.npm/_cacache/content-v2/sha512/64/36/3e6cf9b9cd34c5f98a42ac053d9cad148080983d3d10b53d4d65616fe2cfbe4cd91c815693d20ebee11dae238323423cf2b07075cf1b962f9d21cda7978b +0 -0
- package/.npm/_cacache/content-v2/sha512/64/95/490688f6776ac694b016a8607516f15e13405c0a7f0c3b51ce7724596e6836eb596030fee2911fae7577e16e749c6da536d5dcb99fe382ed6db12e7cdeb4 +1 -0
- package/.npm/_cacache/content-v2/sha512/65/92/9298300414e8a311104b92661f27ebe6937c3eee138b603364442b91b8c246126a9834234bc81045c162953217f068417758e774665c3ce94fd60bffa763 +0 -0
- package/.npm/_cacache/content-v2/sha512/67/24/83ecd7fdd5a2c1d11c4be0a1ab28705797b11db350c098475ca156b05e72c3ed20e1a4d82db88236680920edaed04b8d63c4f499d7ba7855d1a730793731 +0 -0
- package/.npm/_cacache/content-v2/sha512/69/1b/c97042acca90b24939f254b952ccd740e9a23daa5e1cb28eec5a2076a3123dce1f9eb03ca63f9b4922639d2de2f25c692d090a5b694b63e550001d00b6a1 +1 -0
- package/.npm/_cacache/content-v2/sha512/6a/2f/afe34d1833980e6240daf8618f5f1a8ad0fe2a4d900bbe8ed5e1a30194187acb3efd2ed499152c4d7e98b64dc32ac77d03888e6aff45035577ed975d964d +0 -0
- package/.npm/_cacache/content-v2/sha512/73/20/39ea208c1c087909dce32486b86a8849c9e3b561bc0b8b725cdf9326454ea9a2ba058c8199cd4ceea468913ce8e01e0f532eee37c5ba705e4e76ddf33128 +0 -0
- package/.npm/_cacache/content-v2/sha512/7a/1f/4efa1c111cd6c6e012d38c49779f0d38e029069b95fa2e86827fb2cfa7b514f10aede3b258362ea73d7f318d6f7b4ca18a9b5a2e72d834412a597bdaab9f +0 -0
- package/.npm/_cacache/content-v2/sha512/7a/cf/783379d321fb043e2b1169f6a4f870cb7c75e7281855def5397aa3dc4b77e5216a9cc495a05c75e27b2dd8ae968db1a9d8e5e8b55686046cece28eeabd04 +0 -0
- package/.npm/_cacache/content-v2/sha512/7d/ec/6150514f4c657cc9b02d48819b57a80e912bfc52d45b0c19c0c8b430e103ca920365b07d81c8f1ad314a9d5a4a2ce98091980a958b0819ac973f9910f365 +0 -0
- package/.npm/_cacache/content-v2/sha512/7e/05/0d1daca7dfcf192b550a545544dc62e1a484277e181359eb387a7f90f94d1006a11a0bc7e32e24b3eea681ef25743b307aef319fbfd928f072f0799f19a8 +1 -0
- package/.npm/_cacache/content-v2/sha512/7e/3a/ae0b9f5c0fb0b25babab3572b4141b9f9197288861bcd304ee3ee8d7e7dd1c0794ed967db4136501e12fd601156a8577df665d8b3604be81074f2088a6fe +0 -0
- package/.npm/_cacache/content-v2/sha512/7f/7a/90f68432f63d808417bf1fd542f75c0b98a042094fe00ce9ca340606e61b303bb04b2a3d3d1dce4760dcfd70623efb19690c22200da8ad56cd3701347ce1 +0 -0
- package/.npm/_cacache/content-v2/sha512/88/36/c368ac14a1d857f3d0454dff28547dca1784a5d97bdb78dbb8c309e8ba8c331b95e45f8f5d76062066fdc57df90f3be7e1004d0be7e8e7cc8dd2bcb81773 +0 -0
- package/.npm/_cacache/content-v2/sha512/8b/1f/c5c4f9f43038dec89ee2ff2a07185b7f117e8bc8d6f148484f3d73833cbf8a07454f93ce9461f2f494c772f8a0a7bfe7e6bc8cf24b068ae423b0a956d64d +0 -0
- package/.npm/_cacache/content-v2/sha512/8d/11/62f140c6a3a8fea1d6621298dacd9696a846a5df0fdb6ac163407404c15b592460e9c5b1f531e625bb0092f17ab9c262c9a280e5320bd56ab9967c6338e2 +0 -0
- package/.npm/_cacache/content-v2/sha512/8f/42/8b60f866eb379a738973de8277a3ae6abe040270fb9b8b2a2d66b5ea11a1b884d6a03583bca9d954ad7e6fc2abfda21a9e4ff6778fafb25b4ebbc9659d53 +0 -0
- package/.npm/_cacache/content-v2/sha512/8f/77/d52e0bd3a39dbb6a7c98c893864d825b1bebe79d062f1349b99a691cd532be9f1029a6408b3082f4699e1d6e55423681928619be933138654ca4068320e2 +0 -0
- package/.npm/_cacache/content-v2/sha512/8f/c9/2b9b72e83035ea845c3faf3e8e73564265462d0cdb57f372105ecdbb9d736c408b2cde9c2cbbaca4fc587c3cd35ef3a7af39a7e1e2bf96ddc903ebd42d3f +1 -0
- package/.npm/_cacache/content-v2/sha512/96/17/7fc05f8b93df076684c2b6556b687b5f8795d88a32236a55dc93bb1a52db9a9d20f22ccc671e149710326a1f10fb9ac47c0f4b829aa964c23095f31bf01f +0 -0
- package/.npm/_cacache/content-v2/sha512/99/18/47704b22d4ed8aa3f8d60b02c91daffde4eea33d5dcee7de9e778a12250169b389c63515b250c1972bd5cefa4a621de052cfcad56c9ac97c6c46b20f9c10 +1 -0
- package/.npm/_cacache/content-v2/sha512/99/bf/03b62a44e449b6e30ffd9d27aa082bce674f846e4b45469c2afc8dfbf9cf461d1e30e250eccce1dc24502995c67673d7261a3aa2359242e00554722835e3 +1 -0
- package/.npm/_cacache/content-v2/sha512/9c/18/087e0e98f32d3d1eb5cb8f45128469888bed1099afe11b82d01ec15fd6b82d8b94e4160c9091f5da625d6fc0982e0feab4f19648da7b7fd5067836ffb313 +1 -0
- package/.npm/_cacache/content-v2/sha512/9c/8b/5e07a34a7efd07f09a481c3320e608bf1ed0e6f530c72c9b7ef810231528d8b8a902a49dd7c63d174f8d34a270d5985c8c78c6fcab0383ce83467fa94269 +1 -0
- package/.npm/_cacache/content-v2/sha512/9e/52/ec533826d647cb5d25df45931cd4a2c0ba077886a2470d3bdcda10c8c12de66407cc12e31b734dd2ba3305f8611ca5a5ffa9ba1ec9cc3a88ef09c15bf6fa +0 -0
- package/.npm/_cacache/content-v2/sha512/9e/64/f64f49658dbc5d4197eca6c9e8f6182b1b7522afa2ace5a7e2b26eb6a68c6a04ceac0e7304b8f9b34eaf17374384c2a28b2dd8758d0237ab213ae8dcdbdf +0 -0
- package/.npm/_cacache/content-v2/sha512/9e/cc/de1de3b9e1bd8c19a2210c629e54738a0d8978207c77dd812cbd126ee06494c8dd21fb9ff93d54409e2c1e631a083eab5706e29890971a602b60f72636e9 +1 -0
- package/.npm/_cacache/content-v2/sha512/9f/33/8cc755942d8929159509573857ac18cec87aaaf0946bfd76cbcd0c7b6cd5e4a38251b9c644b40321df337641e15fdf9607d5dcd0d7b6f400ab195b11226b +1 -0
- package/.npm/_cacache/content-v2/sha512/a9/e1/485ed3f8312a22e8d2ea3b5d967ea011596b822a2d919fff6124b126b41e724cdafd0ea1569094427f6a92856ccf7803119ce802aead2c83f28bbf9112f7 +0 -0
- package/.npm/_cacache/content-v2/sha512/ab/15/c8121e290867c72028f5980250dbfd975599230834dc1207e8490c5cfdf622bd46714e493b2f76c30494a836b1335c8d7ba143b90e9d3b92da84e4acdccc +0 -0
- package/.npm/_cacache/content-v2/sha512/ae/9d/d2a34eca71d9a629b1af81a37141226bedb1954959394bd12ad45fa9a5b468ef4f9879a0f1930e4377c34f37e183e9b8e7626d95b8fb825e6a6e62f9825d +0 -0
- package/.npm/_cacache/content-v2/sha512/af/99/2539628800a2aa0f75281fceb7dee257c44618b1e7b2579ed91cd0cc4c320e64f1d1cd762cfa4dc093805169697891f83d27bd49cbb1a0c46009e766a90c +0 -0
- package/.npm/_cacache/content-v2/sha512/b0/c4/86eae8813cc26b7dfb5c095299e8d9b392c4d3b26e95a0736a0e93e14e5a532b33da47ecb9f8c6756f22a21ea62399d17e15f3c3819ecaa7043faa2e8914 +1 -0
- package/.npm/_cacache/content-v2/sha512/b0/f5/38b95edd625bed589c70c311c3d0fba285536213b4f201b439496c43081f66518bce82ba103b061040e28f27c0886c4fb51135653a82b5502da7537818be +0 -0
- package/.npm/_cacache/content-v2/sha512/b5/68/45061874ad6a7120066d941cf31c0dccdf1fef5bd57d2c82e69504abf547991977d32932e0f3d6a6741cbd9a3dfc7c9f95475575462a493a52def5216e02 +1 -0
- package/.npm/_cacache/content-v2/sha512/bb/8f/23f745b4aece3610bfe111cdcba9b2801b5c2e475115456eb9f1f9a33662faa638343c1133d50db136cd3a4f4608d995efaa119e7d3bdfef6332e0f96c26 +1 -0
- package/.npm/_cacache/content-v2/sha512/bc/55/348b438386fd352d07fda5c5f65d5e7d7fc0fc4c6ac9cc7e148dec898f0cf827816c9da57ca65bd15ec908971c5765de35a79b6b29f0896a5c9527d8cf9a +1 -0
- package/.npm/_cacache/content-v2/sha512/bd/8b/7b503d54f5683ad77f2c84bb4b3af740bbef03b02fe2945b44547707fb0c9d712a4d136d007d239db9fe8c91115a84be4563b5f5a14ee7295645b5fabc16 +0 -0
- package/.npm/_cacache/content-v2/sha512/c1/0d/05e30dded4436e81b3c83cd7bc4a1402c3454f867330981b0a292a7f8b8b62ac74e54229707801360d7007df839eee1b6039ecda4977085b15b8cb05def9 +1 -0
- package/.npm/_cacache/content-v2/sha512/c1/27/c482b98e64decd58dfaefe6b02a22f0a1b3146e74882c3d0c0a59156e8f56b3d29cd7170fc2ce88e35e44a54a50018049de4262403f40d7d2edaf339a7f7 +1 -0
- package/.npm/_cacache/content-v2/sha512/c4/ee/99fe6fe1d1e7f7f4ad7d97969088d7373133ab91da42adef982dca171615580b0ac3c7cb4e5b433d3ee87e070c74b8b4431bdc05b0fe80a4bfc3197b3f3a +1 -0
- package/.npm/_cacache/content-v2/sha512/c5/b6/c21f9742614e53f0b704861ba1ec727cf075ee5b7aac237634cce64529f6441dca5688753f271ce4eb6f41aec69bfe63221d0b62f7030ffbce3944f7b756 +0 -0
- package/.npm/_cacache/content-v2/sha512/cb/6a/7d6723dcbe3a2b2d25a413d110d9403ecc3be452f0ad5ee8bac4bc5ab9888ad04a405f8304c7aa37b33f2aa0bf0bdedcc577db055f32f6831bba106bf49a +1 -0
- package/.npm/_cacache/content-v2/sha512/cd/d1/fa475aaabe56bac9aeedb5b0ebf7f7a723fdd949adda457ef43f3041e234f193893a6f60c1f6c1457c8c7b87742354020e74463866f22821f222d6d196c9 +1 -0
- package/.npm/_cacache/content-v2/sha512/d0/3d/e37bde87ffdb4bff1f3de59ff5fe540747d1e4f07cb5b2a9b5b4737ab6fc1bd1f7bf68eaaa4aaacfcb39e9d467992f69e2c34e086bc95edae7053728e92e +1 -0
- package/.npm/_cacache/content-v2/sha512/d1/fc/e3f49c4e2df27e5c62e147ccdedee9cdd0a642819c224920f3d7af151118caf1697c91549d72eda4b29778b38c2d01ad72feaad5462000d1672556cbb49e +0 -0
- package/.npm/_cacache/content-v2/sha512/d3/c9/1c1aa9d87ff6268e84617f1caef822f106352d1cb5cb5d7fef51fc7d9762d8cc6ddcd66eb59eba72154648eb3792f8b8bfc1630c89d0fd2a0aeab46ab798 +0 -0
- package/.npm/_cacache/content-v2/sha512/d4/36/062293a4d3601afbf81b91fbfe8a1e126d93c7f32662f8ce910d997d27c5a17c737ce027b853ff83278593399c00b29bcfbe71d8577ec9d54871a73d03ca +1 -0
- package/.npm/_cacache/content-v2/sha512/d4/d2/dfa3175684eb5c818fdacd638d551e9318ac9affb090af3878e230ffd6e130f671d30da8a15ab8ce1b682e6a04adff578dc2d1436209bc69739c419c0706 +1 -0
- package/.npm/_cacache/content-v2/sha512/d6/52/ca07632edda18fd50ff67823b1d1f35b44c7bb5ddc24b703abba17eaa9dd2b2095b03780e1f84de1acf4a50c25e7491ed4b59d4ddfcad55e6fbaf8c12125 +0 -0
- package/.npm/_cacache/content-v2/sha512/d7/28/8b3d72ad6e1fed3dac6a144430c52bd85ce41b5efc38a39b75343037523e298109417514f9561218f6d7b127eb8307d5de9513e276ea1bdde94cda30e0e9 +1 -0
- package/.npm/_cacache/content-v2/sha512/d7/53/5dcfb36ffa6bc00b58f492d4daedf01bd2f2f21865feacc1cd05842f8900c65341f0ee585cb4900da9b3e1bbd9d5f7f8b34ff227b53819ec89bff4b26cf6 +0 -0
- package/.npm/_cacache/content-v2/sha512/d8/12/593965eeda9da864a0bcc2ad55082b5aa47e18b0db6a6cfab32d2dbcb633b96c74ca148c0dc09e73964c6a5200489f1ba15aae8a6f793044cbae7b0dd58a +1 -0
- package/.npm/_cacache/content-v2/sha512/da/54/6f4c4aadc717fed8763ca38c6671e370875b50ff354e196811366d5192b3ec126f92c3894bcbcb8be794fa2a2cfa345d78e25ce642ff9239cf90d1e7eb89 +1 -0
- package/.npm/_cacache/content-v2/sha512/da/9d/8a2594d2a90fc8dfe1d7e3612960e6b69777fc12bbfc3162accb623db9fe3003bc852245d17df61db31f3acbacf8bc7b55f2eee0fa93e5afcff8a2e031b1 +0 -0
- package/.npm/_cacache/content-v2/sha512/dc/00/216cb85d3af3b2e435d24c0cd7a508b7473de6925b3a4a631d0d69f1c214373b21be45963003cb392e7eeb9672e7c057abfdd24d4e5c7c4e9327e8405b51 +0 -0
- package/.npm/_cacache/content-v2/sha512/dc/0b/a78170b823c90ab12f4fb92e091f69dcfb46d563f9a382b7a98474c88bc7e911e1ac4c705425ea2ca7459cd66c983049660f407739ce172ff1d52783d5da +0 -0
- package/.npm/_cacache/content-v2/sha512/dc/51/8c065a25f5fedde32ad0e8a6e4480efb8f55410fbd3ec09d0c174cbf68a5a3e5697580b4f32a155d9bbbaf24f4a03788acf608a444baf364885f2780b2d9 +1 -0
- package/.npm/_cacache/content-v2/sha512/de/46/b2cef6d7a2232eda913bd0b4cf1248e733b5db29d98e4a066909ca64a9e2b08142145bec74d124d5ea22e271d24685026b399d797adb61f7e98ea87e0e8f +1 -0
- package/.npm/_cacache/content-v2/sha512/de/5a/b3e588d64d89d6e9d9436b94cb69309c4a17daaf57b8d2b99c255c020490ba996945ba3d1e0872049661b5839932b89fc60fef169f814509ccf88093df69 +0 -0
- package/.npm/_cacache/content-v2/sha512/de/fa/e3bb589ee3f15208db23308e7bd368c2e383215f695bb4b6d322a2063987ca225b8c408edb5f83a5a85b25d4ac41d71b9b03f9ea361971db7170d9a36c90 +1 -0
- package/.npm/_cacache/content-v2/sha512/e0/33/c3ec85498134ae82685ac3bc5c43c81469365aa05a9e88a56dcda20b5d89c06df6889bbfaea9f6d03042ea0d4697976aced1d200168221724d9e50b68b97 +1 -0
- package/.npm/_cacache/content-v2/sha512/e2/4e/5574b3313cdc53cdc8be37837b1aaf2561617e81687f8a0c6663d96c80ca5e98f3e0f02c4357cc31893ed783e6822913447a4abbd5c51fd921ba696caf05 +1 -0
- package/.npm/_cacache/content-v2/sha512/e2/d6/05ca27da15f19a72888e6e325e828964c12538c503466d581488d6155316d0db1da552c16f638855815cc68887ba58b38fab27165c0e3497e3d6b31b6153 +0 -0
- package/.npm/_cacache/content-v2/sha512/e3/1f/300ea3c17617267449b7f1f698f9d6dbb5748b8bc856311865eaa839e8c05f3eb40d15ac091558cbc499d31ac6bcd4e337a73a458a7b21e718efe576ec48 +1 -0
- package/.npm/_cacache/content-v2/sha512/e8/f0/5cb0345ee3c7489a0ded1e57ed7715e230663fc49debe02d1cb388c20586c7559f7a7c483fc70e35ca14c1aaab522f4cecdd49bf1e5e31c8d1387815ad62 +1 -0
- package/.npm/_cacache/content-v2/sha512/e9/3b/484f1ac02e30587152bacf185450d8fad9930fc98acb80ad3d601993fc8bf8a3ce0cb061403fdbe18da0ac9126b9724049965564431023cb5be14b976bb6 +1 -0
- package/.npm/_cacache/content-v2/sha512/e9/b6/166889ee3bb59092abce46b8934f1fa63bdb93aaf72430689c6426799b9b444d989dd8146c6d82cb6842a53fe71748a1093db0a5a94cce69340fe451535f +1 -0
- package/.npm/_cacache/content-v2/sha512/ec/40/079722c7239e9510874ae7bbb01dd1ca21a0066e75cf8b0d3259b6ab41938a68aa6f508816d2359154b89ab6733e5d7952c2c6a72011ff87318c26e94ca3 +0 -0
- package/.npm/_cacache/content-v2/sha512/ee/b2/94cb2df7435c9cf7ca50d430262edc17d74f45ed321f5a55b561da3c5a5d628b549e1e279e8741c77cf78bd9f3172bacf4b3c79c2acf5fac2b8b26f9dd06 +0 -0
- package/.npm/_cacache/content-v2/sha512/f2/b8/8ed35df46cf1b9c0334aea3691ba6b5c49d36c00330c3a4ffc8467b7f72fcc131e2fd4fd34ada232ae935b13a5edf8c183e233b858203c9127c21914f33b +1 -0
- package/.npm/_cacache/index-v5/09/a9/fee16b030712b0f86fea4ffebf8d4200ef0f9880f329be62027e519df4f3 +2 -0
- package/.npm/_cacache/index-v5/0c/af/66c45aed694b50ce029354b18d2dbc0d31fcfbccbb3c175bbff309501da2 +2 -0
- package/.npm/_cacache/index-v5/11/cd/6bad29635813d9d16b3a2d02542892345db19a559dcb44c848f337e93bcc +2 -0
- package/.npm/_cacache/index-v5/15/1e/f750d3d270cc1d1748f1c1afdb20b29eda342bb7b5372e6473f9e7216505 +2 -0
- package/.npm/_cacache/index-v5/19/dd/12567ecf9fc498746b0f55b6345d8e65a84d05139903c21ccb610ad9a89b +2 -0
- package/.npm/_cacache/index-v5/1b/ed/549424dd308389bf419007f2aa977210cef08ea4c7838e11d8a9e3229313 +2 -0
- package/.npm/_cacache/index-v5/1c/54/a0ec02e1d1830abbfbf22dc509ce961d56dc7919cc52ab1804c697668661 +2 -0
- package/.npm/_cacache/index-v5/20/1d/19e050687f7fa1cddc140a79b7422de025604dbaeeacea5975aada1447ff +2 -0
- package/.npm/_cacache/index-v5/20/90/5b8a97881f06a492e9e71dddcf82c62cb74c2e93e376a65182460faa4200 +2 -0
- package/.npm/_cacache/index-v5/27/b6/bc1d086124331680bbaa5c4c1b8d244d40fc2dad68e9fe8dcd4f002638ec +2 -0
- package/.npm/_cacache/index-v5/2a/73/f5b12412d0e8766b46ec3a813882f8caa828b5c3948efc5468c88b123a11 +2 -0
- package/.npm/_cacache/index-v5/2e/4e/1e243a1bd453c4f434040b376f8d55430c17e4e25a98d014720bee55135e +2 -0
- package/.npm/_cacache/index-v5/2e/ee/e841228f2c58d3e1853bb640a1607ad94243fc71ab2306da6ce84f1ff576 +2 -0
- package/.npm/_cacache/index-v5/2f/b5/99a8ac8d9fe0f2ad4894aa959445cb3e3c9b6cd11883956769678b196ced +2 -0
- package/.npm/_cacache/index-v5/33/79/1fd5dff4bd3e40ed8c25740fe340515b2184e437d434ddf5ed350839603f +3 -0
- package/.npm/_cacache/index-v5/36/d6/0ec727dc46dd7a5b3d32487a89e6ffba1789d0a5f37a3874c6520a568849 +2 -0
- package/.npm/_cacache/index-v5/39/50/f0cdb757fd9e75608d06f560aebd72684f5a59c224261dbac8c133a094db +2 -0
- package/.npm/_cacache/index-v5/39/89/e8e682ce0db1fe5b9aaee559a8fa991048e82cb974696de59c87ac25cdd1 +2 -0
- package/.npm/_cacache/index-v5/3b/c9/68da17f4dd09e12875ca6413db4655a89b5a5eb8613faca86038e97a5c72 +2 -0
- package/.npm/_cacache/index-v5/3e/6a/f79965107e927f8cca9fcb826beba0b559bf4abe38ca8ee68a0a1fbbc5f6 +2 -0
- package/.npm/_cacache/index-v5/40/cb/9c7967f3b8ca30bc891a3d867197a739fda2b6820f63e80be2af3b7e87f1 +2 -0
- package/.npm/_cacache/index-v5/41/3e/151b03bcacd057978b4c891ae842f10b5c2fffcb8c0fe905a0ae7d3751d2 +2 -0
- package/.npm/_cacache/index-v5/41/d6/d667cce771c080fca6ef96561e838a4d1d68c3e3a819d5289c2ea3d25b8d +2 -0
- package/.npm/_cacache/index-v5/43/75/8fc648840100aa96dcb2ff5e39a9f835b1593908ad4c2cf03f0f0fec249c +2 -0
- package/.npm/_cacache/index-v5/46/19/40450fcc6c50118d248943b47c1604211094b7c983b13e49f8734b58ead7 +2 -0
- package/.npm/_cacache/index-v5/46/b3/3d15bb50b75b21e94837be0b830f143588e46710a66a4d6e323a4c0bcfb3 +2 -0
- package/.npm/_cacache/index-v5/49/be/d7c7226070dfe99c54e937ced9257a48a91cef76a2a78ef05a3b00db3779 +2 -0
- package/.npm/_cacache/index-v5/49/c2/6b0f3de8953e1f78cb273e90a4a5b266d906c96f3e10dd2e1bc16f9b2e51 +2 -0
- package/.npm/_cacache/index-v5/49/e3/9e9fe3c971d008e06398df8208c78d9f5dcc5be0d68b07c2580c7cbada47 +2 -0
- package/.npm/_cacache/index-v5/4a/5f/776548f70b9f8ef39390fa419b01cce22a3d24ea865bae29d44886684b31 +2 -0
- package/.npm/_cacache/index-v5/4c/74/a2b741aec6bd4dd94223969fdf1afbd63e8b8cbafb7cd5d5029acb3181e1 +2 -0
- package/.npm/_cacache/index-v5/4d/dc/fc4845b4d897527a8d76f83ace9a59640d93ee5356ef3fa40374289be8f5 +2 -0
- package/.npm/_cacache/index-v5/4e/5e/e2a6284e759231bc5e31fb0a378c5e22d4e10ad3f06818081bf46670577a +2 -0
- package/.npm/_cacache/index-v5/4e/cb/181b542af5715304f09bc46022c0baa2bde37d2b7e9fa2b39cf626f467fb +2 -0
- package/.npm/_cacache/index-v5/50/9f/0c6c4e2c4d603bcddf865dcf757e6dce59dbf6a03df01ff72d13a7b141f6 +2 -0
- package/.npm/_cacache/index-v5/51/63/fb556d33d3ea2e24f5d250373faa6b1a6d0d6970498a2c7cc282f0b893b3 +2 -0
- package/.npm/_cacache/index-v5/56/55/00374dd6a1a617292208c4a73101736334607a8f76a81180650d259f67db +2 -0
- package/.npm/_cacache/index-v5/59/0e/5d7b3f4c369d1d62065d5ca8f8572d2231a581ff043c996b2f5838c201ab +2 -0
- package/.npm/_cacache/index-v5/59/f7/d1a1d9315d444ba266d779ad1123e9b6ce1f2a9f55167821d4d242fd6051 +2 -0
- package/.npm/_cacache/index-v5/5a/98/d6a445f64d6b3b3e2f830db61898c5a703c2796d29da29678d640b699bfb +2 -0
- package/.npm/_cacache/index-v5/5b/1f/5eff49ddecf147e4885c98cfad0d251ce4eb4701e74982fdfd69f6604a7b +2 -0
- package/.npm/_cacache/index-v5/5e/2f/b0d7ba846044fe5a2fa1d8341f6a7f56438ae9161709a548cbda5f1fd7c3 +2 -0
- package/.npm/_cacache/index-v5/62/b4/5a80d5340f0d1a1fcf94cd1847b4d48b78c8eed07852f76260695eec3686 +2 -0
- package/.npm/_cacache/index-v5/6d/ee/ff10edbdd759e2dcf4b7d1a33103173087224e8dd3bd8878371d775146d3 +2 -0
- package/.npm/_cacache/index-v5/6f/bf/2d6ced24d2bf06ff3ae684d783856c45e55af5c37f95409c7732c5e69770 +2 -0
- package/.npm/_cacache/index-v5/75/90/951dcaeaf952ed3e0dc201c77f07958643aad61eade7bad23e66074dfaee +2 -0
- package/.npm/_cacache/index-v5/79/e6/319d4064e5cc0deeb236be141e51d18aab0148cb9c7f5794a23936482b09 +2 -0
- package/.npm/_cacache/index-v5/7c/19/31667f75bbff34151a194a3229f4150af0fcbd1209a9ac910c05548f9d8a +2 -0
- package/.npm/_cacache/index-v5/7f/40/0a265c17fd9c0d008095d8426079ebc85dcf96d73711b217ad91cda8e702 +2 -0
- package/.npm/_cacache/index-v5/81/dd/7d5142549d8d59b3a092b412ba8f4abb4a2a8fd3b5e5a6c8d7bc86bb0ef2 +2 -0
- package/.npm/_cacache/index-v5/83/75/eed3b78adbcdc179f39196693011da33249d7cddc646c44ba9babe026068 +2 -0
- package/.npm/_cacache/index-v5/87/55/e56d34b37c3170079064597cabb288d076b0d0468eaba3b8a0cf8686ce1f +2 -0
- package/.npm/_cacache/index-v5/87/98/e8d3dc026d866d978a5ef4edf618df9f2bcef2dfb8979a38e7107184146b +2 -0
- package/.npm/_cacache/index-v5/87/b5/c156c1ae007a444807d1be64c424e278aaee9c6baf52d9ddf781ffa72c25 +2 -0
- package/.npm/_cacache/index-v5/88/42/031a13c0a51cdf784d4ecbb67901f7ea4101c5f5e65d9e7fbfc98bc83035 +2 -0
- package/.npm/_cacache/index-v5/88/e3/5c1f7e51985c8a2bd6768db98e69b6d4ccfd57ab5acf7b86b30d54d2fc73 +2 -0
- package/.npm/_cacache/index-v5/8c/3f/3f36a0c43685a86c104116ac6b2331e94c005abd54ee9d644a52e1770b8e +2 -0
- package/.npm/_cacache/index-v5/8d/40/8a3f698d330d7e32ab1b76bb79b9c05b892cf4004e52d21ab5f94b2eace0 +2 -0
- package/.npm/_cacache/index-v5/8d/f8/aefda99ca03a1004596e312ea5d597c682502fb85fe4283d6c1079cacd8f +2 -0
- package/.npm/_cacache/index-v5/95/04/7be4ce5fea9cee1ca68a180daec16ac7346e8e84b8d9f55116fa21038ae0 +2 -0
- package/.npm/_cacache/index-v5/95/20/216edd7104928342f4e596f226b589b3733c83a5c056ece5738890de4460 +2 -0
- package/.npm/_cacache/index-v5/98/39/b93a55ccc4e49f1f202fb8da7ee9e687e3a2a49ec42d4759cf6b22a7a96a +2 -0
- package/.npm/_cacache/index-v5/9e/a5/b6441e48e0759935ff5fcea3d2e92c94e0b62e22bcb359d468e677ee870f +2 -0
- package/.npm/_cacache/index-v5/9f/bd/a11cb6204707555e36e340ce8c449f8a985099c46dff7422798e9cd74160 +2 -0
- package/.npm/_cacache/index-v5/a1/30/a81ec09ff8849df96b20fa9c869a01023fc35e39a6fe539bee503fd77a00 +2 -0
- package/.npm/_cacache/index-v5/a3/cc/fa1a298f260fecdc21a2bdf1e86a64042abc5bcb24014ff735b61fe58705 +2 -0
- package/.npm/_cacache/index-v5/a5/14/53e431efe5d40277f768cec075f9e7f618f2296715654a7b953121078b1e +2 -0
- package/.npm/_cacache/index-v5/a8/73/fde854d07eef0c4d20b044c858d8953a2e4d3e9b2d616026c0064799d510 +2 -0
- package/.npm/_cacache/index-v5/ab/6a/e2bfcdcd826a4dfd2b7035faa7ac5921cb0563c853a0427c938b4eafd338 +2 -0
- package/.npm/_cacache/index-v5/ac/fc/4b320068be667cb85ced241d5311571d9d4199a9c342180d60f6f4b341e5 +2 -0
- package/.npm/_cacache/index-v5/b0/4a/c18a99a2710b49b5a3a1121226be4940f623f8ba056f8108a634ed347da9 +2 -0
- package/.npm/_cacache/index-v5/b2/98/e0f9b8885624fdc9b94f7e1b099a7286a85e584b23dde124ea11e4c93190 +2 -0
- package/.npm/_cacache/index-v5/b4/f2/c9d1ddecd2d0318581e16d1e076f8727a883a10aa5c734ca4d7ff13a3118 +2 -0
- package/.npm/_cacache/index-v5/b7/dd/41e330be0241c2ad2159f58d1ae3bef4868e80cbb77f111c548bfbfb5f9a +2 -0
- package/.npm/_cacache/index-v5/be/c3/701969ea8d361f669594a6d9cc5cf7bf3ca20e861e77ac57c70c1979bc40 +2 -0
- package/.npm/_cacache/index-v5/bf/39/69f51470befa7a09b2e33cdadeb663b447746967e3d2d574c412f8266800 +2 -0
- package/.npm/_cacache/index-v5/c1/d3/d6d16b3e7aa7edfdb1c5fe8ef0f9933ff289b5ae0026745e58f8b9d16511 +2 -0
- package/.npm/_cacache/index-v5/c3/24/3bcf5990edce4f749f04b7e4602dae2ed3f0eb3e28ceffb776d0c623cce6 +2 -0
- package/.npm/_cacache/index-v5/c6/49/a763e789545126321e1d90c8a2512f1e0522828bf339c8c8f8ab2396dfc9 +2 -0
- package/.npm/_cacache/index-v5/cb/9e/1e726b6ec1b5894f06217f3396ad8277a0345e4b0558a2de0d73ba79fe21 +2 -0
- package/.npm/_cacache/index-v5/cd/72/69ed43ac332712235b5c14293a8fa232e8f1567e37ceea47341c4af3df4c +2 -0
- package/.npm/_cacache/index-v5/ce/a7/0a9cdb608774812742406d8b587d1421d2da3084285affb184b7f0f52f3a +2 -0
- package/.npm/_cacache/index-v5/cf/9d/9e67e4844cd999769d1f2690058aa483a134ecc7f3bd2620604908593b56 +2 -0
- package/.npm/_cacache/index-v5/d0/39/f3ea46b7a48d1b108681523c9e802f48f2779894068bc9b984863ca18939 +2 -0
- package/.npm/_cacache/index-v5/d0/f3/570007f66e0a594c21201eb3e8f15d7a4d92bcb97b59246e5b7194b3b290 +2 -0
- package/.npm/_cacache/index-v5/d6/47/0b796a99c82c8fcdcdc3380884e2104085a357ad0ac568827bbf53c1f6bf +2 -0
- package/.npm/_cacache/index-v5/da/fe/b945f99b49edea86ff5cf08ad97ca4a0861012a3d68173468ce52ba5f3d6 +2 -0
- package/.npm/_cacache/index-v5/de/33/938d7069db5a8a709b7239270d65a00e0eefae4576ee520aac7e323abaf0 +2 -0
- package/.npm/_cacache/index-v5/e0/3b/55e56e6f53ffe7a3aa682cb279b0f1f907be037ece0730687bb49a730313 +3 -0
- package/.npm/_cacache/index-v5/e0/f3/563a92774ad5fa62edb9cbc4624c17a784676e377b3852d16ab8dcb28bea +6 -0
- package/.npm/_cacache/index-v5/e5/45/88e62fecd3e0efc635a303e7e1a7af4910b0a2c8135d1b12e8af7b89b815 +2 -0
- package/.npm/_cacache/index-v5/e6/9e/c01f7ae8a5eb9998911000be3acf88063b50e6a21de8ec8288a6060b5f6f +2 -0
- package/.npm/_cacache/index-v5/ea/b4/952a10897d4debe159108fa575080b6875f0f9e3a65e941b028e3341b591 +2 -0
- package/.npm/_cacache/index-v5/ee/3d/1ab77d088759d13cd44eab2a2f7764233b7908340d97282d9765e014f29c +2 -0
- package/.npm/_cacache/index-v5/ee/7a/ee0e1b8bea3f05c1b42f1fe4a17fdc2aa37be14405f4e293de10bd30eb80 +2 -0
- package/.npm/_cacache/index-v5/ee/dc/a5a43b3673367a01b79d642171137f6b27e50e3ef67dbf35773c0379afc9 +2 -0
- package/.npm/_cacache/index-v5/ef/7e/138d06536fa4ad47a86841653c3ff37ac8a889bfd425926c5c32d3489804 +3 -0
- package/.npm/_cacache/index-v5/f0/3e/01e13fed073dc307a8b52a63ab55b3a800abb9ab9bbad791e04ae328ca95 +2 -0
- package/.npm/_cacache/index-v5/f3/2c/80267cf9b394a43404ccabe3e574f5fd89b769b43be625b75ff9b1b4a2ee +2 -0
- package/.npm/_cacache/index-v5/fb/19/7aa5dcd12e502c2b1969c94a076ba116cec77cead0842fc905ab810ea51f +2 -0
- package/.npm/_cacache/index-v5/fb/4b/0fb3ce45fb690a1851537ed333cfcfd6be1e8b868b655055069aab25adf3 +2 -0
- package/.npm/_cacache/index-v5/fb/71/feb8d9228b0423904cb337a8cfd5dadc96844baf9810dea7d35b5d5c64f4 +2 -0
- package/.npm/_cacache/index-v5/fb/ea/7f7a0679c52edb767a55df3d93f847884d7909cf16c2f148ba11d53e9f7c +2 -0
- package/.npm/_logs/2024-06-10T21_52_18_138Z-debug-0.log +33 -0
- package/.npm/_logs/2024-06-10T21_53_05_223Z-debug-0.log +25 -0
- package/.npm/_logs/2024-06-10T21_54_10_311Z-debug-0.log +67 -0
- package/.npm/_logs/2024-06-10T21_55_24_917Z-debug-0.log +387 -0
- package/.npm/_logs/2024-06-10T21_56_13_595Z-debug-0.log +92 -0
- package/.npm/_logs/2024-06-10T21_56_39_063Z-debug-0.log +264 -0
- package/.npm/_logs/2024-06-10T21_57_01_799Z-debug-0.log +294 -0
- package/.npm/_logs/2024-06-10T21_57_27_882Z-debug-0.log +276 -0
- package/.npm/_logs/2024-06-10T22_00_01_096Z-debug-0.log +34 -0
- package/.npm/_logs/2024-06-10T22_00_50_486Z-debug-0.log +28 -0
- package/.npm/_logs/2024-06-10T22_06_18_365Z-debug-0.log +13 -0
- package/.termux/termux.properties +145 -0
- package/jQuery.min.js +45 -0
- package/jQuery.min.jsy +45 -0
- package/package.json +9 -3
- package/package.jsony +12 -0
- package/README.md +0 -5
@@ -0,0 +1 @@
|
|
1
|
+
{"_id":"qs","_rev":"415-eb86ddbb130a9aa5abc4fd34821774b5","name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","dist-tags":{"latest":"6.12.1","v5.x-latest":"5.2.1","v6.8-latest":"6.8.3","v6.7-latest":"6.7.3","v6.2-latest":"6.2.4","v6.3-latest":"6.3.3","v6.4-latest":"6.4.1","v6.5-latest":"6.5.3","v6.6-latest":"6.6.1","v6.9-latest":"6.9.7"},"versions":{"0.0.1":{"name":"qs","description":"querystring parser","version":"0.0.1","repository":{},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.0.1","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","directories":{"lib":"./lib"},"modules":{"querystring.js":"lib/querystring.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ce6017433e83b67231af788c6eb00ba0dba3f964","tarball":"https://registry.npmjs.org/qs/-/qs-0.0.1.tgz","integrity":"sha512-ZA/YpSnCr9SUkM4MuuaSgFHCp0L2YCnnnwiMLqQAnEV8wgjCHQn/MgIiRMn4/8BaDKfl7p8HJVI9NJX81+JJfQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAbFyxvdySX7cpsrSbriQkk7jWxcIUzEVNcJw1GpNiOPAiEA3bGHyJHyygOwoiwj+zVR2VhvA5jw+2FvpXZTNqCF8OY="}]}},"0.0.2":{"name":"qs","description":"querystring parser","version":"0.0.2","repository":{},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.0.2","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","directories":{"lib":"./lib"},"modules":{"querystring.js":"lib/querystring.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b4a180d16b43d7f592128e9f6b609e3f225a8d7a","tarball":"https://registry.npmjs.org/qs/-/qs-0.0.2.tgz","integrity":"sha512-/6YlAZZ3y2g5c9pVeVWF56ZNn95jcy3jDY9lL/KyjVea+MI8FEEyQuqsVPYMAe+qqpCBnlKhxFVPWfNwoTpBvg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHnhr84G6kGEyBOO097IkGtkS2WM2D37XJrrQDt1EQTpAiEAn4kE8pichU0WFQfGAjUT1WjI/kpras3rmak54hlHaio="}]}},"0.0.3":{"name":"qs","description":"querystring parser","version":"0.0.3","repository":{},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.0.3","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8","directories":{"lib":"./lib"},"modules":{"querystring.js":"lib/querystring.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e16a190316d4eca7555c6d361f1aa9f1ff4ce124","tarball":"https://registry.npmjs.org/qs/-/qs-0.0.3.tgz","integrity":"sha512-hHMmdXwzYU7GiESpOygHEwiXDZNJJ/Zkfmz8S0S126HFtoeYRC+ZslzwWJb63DgcncZRquvz6fIVcIkXoQTnpQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuUeQ0X/kRgjfHdIpu+sEng0UwqpcNAq5w0sENQqpjKQIhAKW0LtVgINlT5Nkk0aaA6MYsXoc4BFkvvBxPgsVSYJIu"}]}},"0.0.4":{"name":"qs","description":"querystring parser","version":"0.0.4","repository":{},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.0.4","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8","directories":{"lib":"./lib"},"modules":{"querystring.js":"lib/querystring.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5484dfa3cb8f58cca93ba1247d8a3015be0d9cfa","tarball":"https://registry.npmjs.org/qs/-/qs-0.0.4.tgz","integrity":"sha512-YWpPhjf+Oo2alb61r7D34QwFIqeKAM3M0/NuBlS/3RFwtMDu18Po/10NMQW66aGNjJaz78uU9GpRhNd8rEoB8A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCW8bh5XR01zglqTO6xfyHyu0pfc3YLUaOdJjrBc5Mh3AIhAMmW9YEew+jtT671m5Nk5KyrO8CeEAM0ypKPLUse9rrE"}]}},"0.0.5":{"name":"qs","description":"querystring parser","version":"0.0.5","repository":{},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.0.5","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"modules":{"querystring.js":"lib/querystring.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"54e6adc62a8bfd1d837d81cd6bf1d68ff203aba5","tarball":"https://registry.npmjs.org/qs/-/qs-0.0.5.tgz","integrity":"sha512-Ir/r8QYnLeM7MVffvBLR8dCJJ0Wxzw2/qLbI/rkiqa6L8Q/+nIFHJmRnxY3uGTAvjwWVABB9V2Myf/iBiaWziA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1qavoTCFn8Fgtf9Hdp54EXelvLdxzarPXYE5jvBUAYAIhAPcLkpicgATBsfHhRvXHGF3ta1ZMoApExas/yzQiK9Vn"}]}},"0.0.6":{"name":"qs","description":"querystring parser","version":"0.0.6","repository":{},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.0.6","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","directories":{"lib":"./lib"},"modules":{"querystring.js":"lib/querystring.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"481659b7e5bf6a5ea898010de5aed35eb469e124","tarball":"https://registry.npmjs.org/qs/-/qs-0.0.6.tgz","integrity":"sha512-1i8kQcg7L3IYwt9uLfTfAGucLE+wrp7hB+xEGbM0yFp0tbsykoXmSyi+AWn0qdglKMdPzIrzS6w5Ack0ZvkfqQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCsfobzYLEUkegwuolsg8KOD2QNRLPVlCZdG6dDIirVSwIhAICjcCWuhoMhnqrZBskkiaK2llQeKV96ZdKZgTIyVl8v"}]}},"0.0.7":{"name":"qs","description":"querystring parser","version":"0.0.7","repository":{"url":""},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.0.7","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7a85d1c3cd17ad9ba94211cbb24b57f88f75ec40","tarball":"https://registry.npmjs.org/qs/-/qs-0.0.7.tgz","integrity":"sha512-UOP7s2JDFA6tUZkBOVsEuMOMwHfshh9PUZTnWrATtXzosohjDtgHA6BJ4gB6r9ZM50Ou8BPt9iNAYbRm1jASIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUeRLrxFUyj2wCkUWOAM+fezbjpz5cDxQ0SPmI97a96QIhAPkRWOj4i7z/N0bd3lz2Jclw5FahFfqpCRTIia+H1dQB"}]}},"0.1.0":{"name":"qs","description":"querystring parser","version":"0.1.0","repository":{"url":""},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.1.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9a0d2d70d01f63d3401ea4b050822601b462ee6b","tarball":"https://registry.npmjs.org/qs/-/qs-0.1.0.tgz","integrity":"sha512-ToZQFywckFeLEvpo5Ofy2AwXb1ywEUhZlRdN3OyZZN8262BkPPiX8dlp5YIfeV50PkrEkkXjGTN6VNLMChGUyg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAmLRtPzGk0ic1+xRM8cbR56U+9HSJIWMMu2P+ZoqqG4AiEA0qeyV5pn1f00PLHeuFYMQc3p7K2w+EcOXeQrnQ363os="}]}},"0.2.0":{"name":"qs","description":"querystring parser","version":"0.2.0","repository":{"url":""},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmJsonOpts":{"file":"/Users/tj/.npm/qs/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"qs@0.2.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b39234e77a55f6276a9ca305210db02304792487","tarball":"https://registry.npmjs.org/qs/-/qs-0.2.0.tgz","integrity":"sha512-THeDmmiD3gM+/GIajyKAf33FLrWVFQlRIHU74cLxx/UsjQhj7hFRjAXfoD+c4yAOJD7M7MA3elLMSUyT77OVug==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDI9fq78d494vEOP8+N872cYpchbxOILl9zYvpbZ98KfQIhAIca1ma5/p/O9/7aij5hXzswSESjYloiQamUhWzTHog/"}]},"scripts":{},"directories":{}},"0.3.0":{"name":"qs","description":"querystring parser","version":"0.3.0","repository":{"url":""},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmJsonOpts":{"file":"/Users/tj/.npm/qs/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"qs@0.3.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"502ec1168b8f778921c31d0e4351759bb97cfb84","tarball":"https://registry.npmjs.org/qs/-/qs-0.3.0.tgz","integrity":"sha512-rqFWzA5c/lKwkEN3HTy8a9eCbMLDox4mr0ZgYms9+KkCvF/DlccgktysyLnmfzKDY42jCBAUmsRJWodrL7Nocw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzZYpSOQtzJZfO2A5gGKKzJbyxCw3suDQTbCGQ4H8XawIgRth8Q/ISgny3KLLQonNZwu6nJxOIJJOQIrQwnTMiSSI="}]},"scripts":{},"directories":{}},"0.3.1":{"name":"qs","description":"querystring parser","version":"0.3.1","repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"expresso":"0.9.2","should":"*"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"qs@0.3.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"42871928506939d6b29d1b192f20e2a28b2c69f4","tarball":"https://registry.npmjs.org/qs/-/qs-0.3.1.tgz","integrity":"sha512-lPN8zwdQziuT9qpYR0qcOVudXc03FEBKyLItuDVZd3Bu2lrnnSON1KN8Y7FTKy8PvqVmsidtt8qgqVAF4NEDCg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICTdbdU9WEQvx2nYJ+tZo9RngfLDJTo+d6LBijBEjWU9AiEAvFNWgzHsGN/vK90fm51DpWNzkN88M439JYxS9zORgMs="}]},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.3.2":{"name":"qs","description":"querystring parser","version":"0.3.2","repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"expresso":"0.9.2","should":"*"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"qs@0.3.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"099df444cab947bbadb2bfedda56d33519d6815c","tarball":"https://registry.npmjs.org/qs/-/qs-0.3.2.tgz","integrity":"sha512-lQN7JG5NsxXWk40OWkqXhm2sXLhvWdpVxpHpUCHfsp7Lap4i8dCof+Xnt46FVrN29Ye+6YyZHdUUhYXo6pi3wg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8/u63h12EbFJSjSliuCt0Cn6rYpNhYlOVSI5F9ie10QIgaPHBDV8McOx1eYODMZSIVTRDMs2o/+UGrjT6Atq11l4="}]},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.4.0":{"name":"qs","description":"querystring parser","version":"0.4.0","repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","should":"*"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"qs@0.4.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"32343c3df5937fcd46e10bd0521b31a01b062705","tarball":"https://registry.npmjs.org/qs/-/qs-0.4.0.tgz","integrity":"sha512-Y4LDEahNMUC5FpRVCA4+XNO5YKqQQW9UTSvHPBiu1RPh/aw6DgAeKb39l3Jd/asI6z5chdEdrzb7aZHGHGsTww==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzPoZwHfCFWKGkFkHY8QTTCYui9OYI2cmEgWzCMEkJVwIhANrnMFJkT7TgVMV/1e7M+E5mo5SwyQbaXqvI0clMXyiA"}]},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.4.1":{"name":"qs","description":"querystring parser","version":"0.4.1","repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","should":"*"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"qs@0.4.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"bea85a35a4f29c80864db6e3955725d2594417a2","tarball":"https://registry.npmjs.org/qs/-/qs-0.4.1.tgz","integrity":"sha512-l4bomba+u1nXEY2YPySnBjzxXkPgI+2BXaTsT01MdQvZoMBLzhZFUunDltPLYP446us5DbaJiYeeZTpG1h1dEw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHy0vv7EYI+2qp5QNqWEZ9hKe/QJVdUnhJFghZ2H+S9rAiEA1as+I556pQZrf8dTupPbAFzacwpRI5/cSOcm+mabFcQ="}]},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.4.2":{"name":"qs","description":"querystring parser","version":"0.4.2","repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","should":"*"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"qs@0.4.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3cac4c861e371a8c9c4770ac23cda8de639b8e5f","tarball":"https://registry.npmjs.org/qs/-/qs-0.4.2.tgz","integrity":"sha512-VAtfWeUtlBOnGiWFok2vOIMmwumiLmpqXDcXQcAEIQmLYgDbjrkHrcFBfth+YVDeRsz7jX44dhJr7IBJR0t/FQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4AAGxcBNWpBASGeDIocssMU5tUGVLQuR4pUoaoA8NXAiEA/XkMTraFC/5wIxQd2zsEmcCpE7gqcXyIc3A+YM6vYm8="}]},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.5.0":{"name":"qs","description":"querystring parser","version":"0.5.0","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"qs@0.5.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"fda53429faaa8a3a72f630941d4851144a24d34e","tarball":"https://registry.npmjs.org/qs/-/qs-0.5.0.tgz","integrity":"sha512-/ohfWFi5SHwH3Px8MdvGS+WPGCKiv5hjYAVCTgvGdDxEfCELLvrcDZV7mfTvrigWLGYi4R61z5mfM6rn8YGXKg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCT53e4+X0XDLJfrAJem9cYjaJ1phHsoKJZggFvIbGvdgIgHrt01A1zSByXNs3eN7xMU8pS6Dg99PyplFaMfxmIEhg="}]},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.5.1":{"name":"qs","description":"querystring parser","version":"0.5.1","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.5.1","dist":{"shasum":"9f6bf5d9ac6c76384e95d36d15b48980e5e4add0","tarball":"https://registry.npmjs.org/qs/-/qs-0.5.1.tgz","integrity":"sha512-1NhhAEZMTI+2tQrOAGFlS1HFmKCcI9mvsysUbfqvvz6ObXwxCvPuAqzD+5LYBbEfjrdSOakWzaZx4wFPnND+xA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGXtLpPH2Gg681myJD1NxxFpk8w72ZW53A8iQrB/V0D/AiEA9LB6YOObhA+mNUyJs3FZ9mzZpOBerfN0QwQ7lK9DgRM="}]},"_npmVersion":"1.1.61","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.5.2":{"name":"qs","description":"querystring parser","version":"0.5.2","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.5.2","dist":{"shasum":"e5734acb7009fb918e800fd5c60c2f5b94a7ff43","tarball":"https://registry.npmjs.org/qs/-/qs-0.5.2.tgz","integrity":"sha512-QYDRP8JGJ3fTiCieCglCfvN6BYBWd/qAm9F4KVAdSNE16Okoyzn/8KQxegJdZ78brV81jTLfK7/KO8YQ94fF6g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCRKxnYqQE8OAIjEdkO9S9+u52qGIAgli8myqKx2FH67gIgYLQmetC80Jue5DHUUkdB29WLKLUFvSJZxHvxI3EwuhA="}]},"_npmVersion":"1.1.65","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.5.3":{"name":"qs","description":"querystring parser","version":"0.5.3","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.5.3","dist":{"shasum":"1f6a85d62780de8c0b3b8c1090e39e1c316f306f","tarball":"https://registry.npmjs.org/qs/-/qs-0.5.3.tgz","integrity":"sha512-rL2nWFMRtz5AV/IAb4Ow+4VZcwrYLDHq6mpHHJxw0+E5irRg8DDQlzSm8bAHjDwwk+UsFOzyE91wL+hudYoBMA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBRVNstz2uhBlO9Gt/7MEkHOZB0LLV62SdUKDre9mvywIhAPai+TLBfFBSEGBqqxqz9zgHnomRy6fTVdpefevmsK82"}]},"_npmVersion":"1.1.66","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.5.4":{"name":"qs","description":"querystring parser","version":"0.5.4","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.5.4","dist":{"shasum":"6f0f27c3e2df2fb10733c002695d0f7e9450df10","tarball":"https://registry.npmjs.org/qs/-/qs-0.5.4.tgz","integrity":"sha512-g4yjtX5DAYwP7fLOmRS/AYPDeMOjzWTzXzna6BOf6HOnP8SeYLoa7NJ3BoDBImWIOnI52voVdZJbfSG7sdt0kg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF+JCxCg4sLni29BnwdaA9LdUKLQWadRTUQhLkeYhng2AiEAyNV2C9ihLg3JrcM1ovagzbIDM1mA7nvQdDrsXvqk0mA="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.5.5":{"name":"qs","description":"querystring parser","version":"0.5.5","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.5.5","dist":{"shasum":"b07f0d7ffe3efc6fc2fcde6c66a20775641423f3","tarball":"https://registry.npmjs.org/qs/-/qs-0.5.5.tgz","integrity":"sha512-TOoCbt0ntLVan+hp6Fkw4//relXUpWMDbNuxiO2KfDOgmO/+leG6RadwEpwlMiBb8YLfbzDJvBngoK8rQeK7SA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4f/2hJZEDmzemsz2vl2POnwnXxX1OW6bxYgfB1hdOJwIhAI0LbEph5z1dj/hU3BBB0sI0hfQeCKn2xH/G1d5mBhNy"}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.5.6":{"name":"qs","description":"querystring parser","version":"0.5.6","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.5.6","dist":{"shasum":"31b1ad058567651c526921506b9a8793911a0384","tarball":"https://registry.npmjs.org/qs/-/qs-0.5.6.tgz","integrity":"sha512-KbOrQrP5Ye+0gmq+hwxoJwAFRwExACWqwxj1IDFFgqOw9Poxy3wwSbafd9ZqP6T6ykMfnxM573kt/a4i9ybatQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAxOTbXBz8+fK38YIrwSD2S3QXkgpt7eVgc4Xs0H7yfXAiEAvXlSXalcPJoGnStRvYd1rqIqc+UGWG9UmJO0vjgCD+0="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.6.0":{"name":"qs","description":"querystring parser","version":"0.6.0","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"scripts":{"test":"make test"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.6.0","dist":{"shasum":"e3377a4fd406e45f5ba378fdd6b91c00a17fc0ce","tarball":"https://registry.npmjs.org/qs/-/qs-0.6.0.tgz","integrity":"sha512-gcquSb3Z/Gb9x5miiz6FFkHYDmicxbf1n3OzX+b6NWJ1gt+GABhC/eZFYgffJfRL/LqQ1vto1IbF9fBr8cI1Dg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAGiR3y7LJSAnkNVIDde43wQrzGrQgXiiTf2tUa2K5+XAiEAwKJ4ZU7VFAfp28AiJ9ZchG28ot+kvTOubGRNboSGHZQ="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.6.1":{"name":"qs","description":"querystring parser","version":"0.6.1","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"scripts":{"test":"make test"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.6.1","dist":{"shasum":"37353130532742683ddf4aa1edc5661612a7cc7d","tarball":"https://registry.npmjs.org/qs/-/qs-0.6.1.tgz","integrity":"sha512-mLvzalseJzYGD6f2oWVmsgZLgMXYV89PJuCgnMPcNyxOza2Paogl8PZoiLqtydOdDtw73yUKuBW8uH996sAQ2Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCP26uuKul7wTjTrZ3rEhYVK4nxqJfw9rLtlbIK1dJUZQIgGv+jNUZzR6cwfJPSg1oYn0Q3Sd1ClMThIQprel/TUCc="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.6.2":{"name":"qs","description":"querystring parser","version":"0.6.2","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"scripts":{"test":"make test"},"component":{"scripts":{"querystring":"querystring.js"}},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.6.2","dist":{"shasum":"905c808930742348ad765bcc7a7445c08e4655ef","tarball":"https://registry.npmjs.org/qs/-/qs-0.6.2.tgz","integrity":"sha512-OLHsXjse4xelM27cLoDRL/6XUY4vWkaVlLRxZgv2rbOGrfpX9ySy0VoC3TbJGpktN1Tl83uXVpBqkrfok4Ta3g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDV9yGwZ1TG2hET5DeFHXOnceaPe7QBU2tL3yJ6Jd5EdAIhANnBGCnKVQFm7jH3B7vbTIXjUIexNaTE28qNjEj388o2"}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.6.3":{"name":"qs","description":"querystring parser","version":"0.6.3","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"scripts":{"test":"make test"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.6.3","dist":{"shasum":"a2a5ae9baa5d720d0f8cd0ca6bfad31398e33e99","tarball":"https://registry.npmjs.org/qs/-/qs-0.6.3.tgz","integrity":"sha512-eI+Zk8WVdl+o5EO5vXcwNva+YfKFMmPLC2U6kzMLlDqC3+SJAIGaDnnbBf2a7RTUqGKjCBVpLQ7HZvfUu8YsVw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAV42hCi6Cq2bg24nupi5sUzeWAB+X+uD79dgbJeA7MuAiADzJ4GI+5ctdAuUYOPwasUw3hEwcKjjG0xfFnH428g9A=="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.6.4":{"name":"qs","description":"querystring parser","version":"0.6.4","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"scripts":{"test":"make test"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.6.4","dist":{"shasum":"8d17ddcfc864ace3f03477382126740ef25b234f","tarball":"https://registry.npmjs.org/qs/-/qs-0.6.4.tgz","integrity":"sha512-5kCEcYO5zYtA8CqVTyAmpXeTjjp2eNe/Qk6XZOPNtKL7RH5FeYllIIHTq1anBEBl9dPW/cnBwsC4sKLxWfegzg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGvZUBToJEr4iHh0ceNt0y1oTwTqu3BdAGoCtTM3ym5CAiEAyktmrjA2k/XwnxoKGSnQaD4dlXK00AFfJjRHtjEGIS8="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.6.5":{"name":"qs","description":"querystring parser","version":"0.6.5","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"scripts":{"test":"make test"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"_id":"qs@0.6.5","dist":{"shasum":"294b268e4b0d4250f6dde19b3b8b34935dff14ef","tarball":"https://registry.npmjs.org/qs/-/qs-0.6.5.tgz","integrity":"sha512-n7wA/f30O3SsOw2BVkGUDzjWMw7kXvQJWKtDdgfq5HJvDoad+Jbc6osN1AQ0Iain5plo9e7Cs5fE+xR+DVkPTw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHm5QDbePI5ElSaXjzjHRqLTjB1BeZeI1QhgaFR1lLgWAiA3O4I1OpMD5l1YmZApuNmFPn9VpNo7Q/vSFcrBqMRoiw=="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"0.6.6":{"name":"qs","description":"querystring parser","version":"0.6.6","keywords":["query string","parser","component"],"repository":{"type":"git","url":"git://github.com/visionmedia/node-querystring.git"},"devDependencies":{"mocha":"*","expect.js":"*"},"scripts":{"test":"make test"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"main":"index","engines":{"node":"*"},"bugs":{"url":"https://github.com/visionmedia/node-querystring/issues"},"_id":"qs@0.6.6","dist":{"shasum":"6e015098ff51968b8a3c819001d5f2c89bc4b107","tarball":"https://registry.npmjs.org/qs/-/qs-0.6.6.tgz","integrity":"sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA+LvknMTOBvIA1FBSk8AM0jP+QwX4SsKOSzJQxE1U6CAiEAp7j2kXY6dIjdCDC3JhOfY9R8elYiO4bFdKi14Tr5mgs="}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"directories":{}},"1.0.0":{"name":"qs","version":"1.0.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":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"a66f9c78309b5e441d4840bf68d1a008486ae0db","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@1.0.0","_shasum":"544f2e30a836ea6b5f28326efb6661244d73de1e","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"544f2e30a836ea6b5f28326efb6661244d73de1e","tarball":"https://registry.npmjs.org/qs/-/qs-1.0.0.tgz","integrity":"sha512-5C/V4Lf6D/i5s08CB9Wb7Nnfvx3J+eeBtyqlVVAuxAhhnSAn2Kmwaoi3niE4d/qjTVufuhSPROP1ihCFFDzwiA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHbPJlSrhLZ3JLe/kvjvs2NIg2CrXG1blmz6MqmQVWzYAiEAwn+LpPJ1y9hGhPbsMqzE6o4TTgf+vN4t4Mt9mgtqCyU="}]},"directories":{}},"1.0.1":{"name":"qs","version":"1.0.1","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"dc3cfcc7ee4af9fd8f464b19c5587f8d1ef9d252","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@1.0.1","_shasum":"cd2edc5257070bcccac68715e855c4524be71ef1","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"cd2edc5257070bcccac68715e855c4524be71ef1","tarball":"https://registry.npmjs.org/qs/-/qs-1.0.1.tgz","integrity":"sha512-fE6K368s+X3P/9wCC0clsferKzpZR6Pihi22LycLIZ06/gpR6cdLOT/lOq8leiTKd+wbOBevSJvq03Aqi8fZ/Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEzgp8eRnpWKDQd4znDwq/Zlr7gIpBWXqF2ZQ1IHpfheAiEA2fyJwC6M7mh/PxzxiglIB+UbhQ7s7J/+bigIkL77R4U="}]},"directories":{}},"1.0.2":{"name":"qs","version":"1.0.2","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"b7af068a898c8456a99613e474c8765dea7f41dc","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@1.0.2","_shasum":"50a93e2b5af6691c31bcea5dae78ee6ea1903768","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"50a93e2b5af6691c31bcea5dae78ee6ea1903768","tarball":"https://registry.npmjs.org/qs/-/qs-1.0.2.tgz","integrity":"sha512-tHuOP9TN/1VmDM/ylApGK1QF3PSIP8I6bHDEfoKNQeViREQ/sfu1bAUrA1hoDun8p8Tpm7jcsz47g+3PiGoYdg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG7DTpdLHTbPNIAsuKf4eclYPobrp4WznXD1OSTBltsUAiBGVuG2nQ9J2XoXey6oGTIRDc1tQUir+gd1kQTwBAUn5g=="}]},"directories":{}},"1.1.0":{"name":"qs","version":"1.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":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"eda63da46d0a730f4eceb249104e0227a7e03f72","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@1.1.0","_shasum":"2845cd9df462b2db28a90370e142d492c5a45dde","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"2845cd9df462b2db28a90370e142d492c5a45dde","tarball":"https://registry.npmjs.org/qs/-/qs-1.1.0.tgz","integrity":"sha512-75mvGtXJWXvALOd+7pVzHS5yIlGsG4Ab/z+ZMDE5ZkNNMjgg1xMQ4nTN7FV/QoSXKjGOtHJvFisbXo0V4vMY7g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFG9QDQhBgfUndDGi2it6dC3GmBbyNjJm1Lm+MvyqKRaAiBRNVfovfjUgJ2PcwAEbbIClpP0hnp39yRCuqMGBowfoQ=="}]},"directories":{}},"1.2.0":{"name":"qs","version":"1.2.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":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"e1ff638989afe27a2c7f8ec7eecf9bab71a4fbf2","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@1.2.0","_shasum":"ed079be28682147e6fd9a34cc2b0c1e0ec6453ee","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"ed079be28682147e6fd9a34cc2b0c1e0ec6453ee","tarball":"https://registry.npmjs.org/qs/-/qs-1.2.0.tgz","integrity":"sha512-XUf0O7rlGjbH+n7uqyT+xn362fmoPe4ehtHL6VK1nbSgQ7CqG0ZZLr1nU2EyXlRq++YphPdQ/5scjIWNMSPnhg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHxJvpvz5nuZ2J65ime1Wqketw2wSMVRG94Zw0e0EWKgAiEAtijjp4Y+5eebPQnBdiT42dM+8e5QRoj6V0TNIwYfnpA="}]},"directories":{}},"1.2.1":{"name":"qs","version":"1.2.1","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"96871b8ebe001a993454f8cbf79c2410dabd7eb9","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@1.2.1","_shasum":"09d0872abc0d187910af0c793f31d0ce335c57f8","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"09d0872abc0d187910af0c793f31d0ce335c57f8","tarball":"https://registry.npmjs.org/qs/-/qs-1.2.1.tgz","integrity":"sha512-hh9GIFlCLr6AMX7/va37MJbaq9YJzGmc8eC5YW4k5HdE6SiIPBBTH+KI3E4paSOyVSrbYRE3A+gdKoa33c86Eg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1b8xTUeZRlKo0s80pe9RQeUCXmeQy1r8+4zpb2VbewgIhANFTHqb5hnySyufRRhwYqBvo98BXPvWJb/DuaxVaXmNi"}]},"directories":{}},"1.2.2":{"name":"qs","version":"1.2.2","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"bd9455fea88d1c51a80dbf57ef0f99b4e553177d","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@1.2.2","_shasum":"19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"hueniverse","email":"eran@hueniverse.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88","tarball":"https://registry.npmjs.org/qs/-/qs-1.2.2.tgz","integrity":"sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8oyWwopctwWmZRqrsaHpiZw4R2fQw75UJVOEhVxsEQwIgclHMgdHhHQJK1lCGkT4UOcUXOs2FXGzBCzUEQnmddmE="}]},"directories":{}},"2.0.0":{"name":"qs","version":"2.0.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":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"124ea733898f68586b2eeae496d035834fa89c7c","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.0.0","_shasum":"423344d2a1324a8eb721e27586d79518ff0787cf","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"423344d2a1324a8eb721e27586d79518ff0787cf","tarball":"https://registry.npmjs.org/qs/-/qs-2.0.0.tgz","integrity":"sha512-eavUxwaEMWeJJ+/mMlS72ovPGFXeSjnJfKvCrC2cI7zkxNjm5N4514xqSvu5zRA0FoXck8sBj3uVc0iSgsShSg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUhECth3t/+TV9pmVrwbd0uOWTKIa3TFe6BFNDvSp9PwIhAP82oQ+LYvf9qqdetA2wXtE3W6357eUJXNVEC8Zn1f3l"}]},"directories":{}},"2.1.0":{"name":"qs","version":"2.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":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"07bb33ec67fe2fc2e34161a3e0d1d94e3d5bb810","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.1.0","_shasum":"959d7b2c89ecc3e2f8a4b2766b4fb00b25e36de5","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"959d7b2c89ecc3e2f8a4b2766b4fb00b25e36de5","tarball":"https://registry.npmjs.org/qs/-/qs-2.1.0.tgz","integrity":"sha512-MX5iyqdxJPE5T39xWSlkuOPOe2a/2nMftN3GN9mThjdT5fEWAGbnJt2F2DOCYbiLiIU9QTNB4aZ97okM8pPBEw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtnH24n7AtMEklNNReEx/sw5N1EJ0GUDI/yqH21t7XxAIgaNxxEqHOfhdP/soVY4+5lxKPXIVu8hkeYJ80D6fxNPM="}]},"directories":{}},"2.2.0":{"name":"qs","version":"2.2.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":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"9bc7567539828d67b02a0c7d8a3204ed3d86da0e","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.2.0","_shasum":"1c18d6eaba0e09a38984f2473a94dd03811f5634","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"1c18d6eaba0e09a38984f2473a94dd03811f5634","tarball":"https://registry.npmjs.org/qs/-/qs-2.2.0.tgz","integrity":"sha512-yioypzzNQGrhLrra8u2GoL9WdeqMPzffQo/rmB3VUr1QG5swpFMw87Z8kPGCaOdTP1GVLx+Xz+wTQ4MyjC1QHw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDz7sXvr166BVFMBuma6yGpre7wVq3294m+A9+oOAyWvQIgc5eBgZv5KcMf1HWuZ3rHRYiGWQM5J8mL0mQafx2mxs0="}]},"directories":{}},"2.2.1":{"name":"qs","version":"2.2.1","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"32edf331cf876d907eb60b146c9251f8d46026b4","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.2.1","_shasum":"2ccc1a02b69108091f1d82de88a316ad94df9cce","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"2ccc1a02b69108091f1d82de88a316ad94df9cce","tarball":"https://registry.npmjs.org/qs/-/qs-2.2.1.tgz","integrity":"sha512-nhYpiBZ0iFAMwA0tB//tOO0jr5wZCicidFOjYWidGG8WsXiLQbC8xbAABIAJdFlE3XLYmeqrzCQM0PDjwIjJgg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcZAsjlVKGgNUkfK2bGqzRBJ8sL2E8k0lFh30AWWtKNQIhANVP7/kVosbZdOdKid3p5YPggviEu2PA0DpNI304BoIe"}]},"directories":{}},"2.2.2":{"name":"qs","version":"2.2.2","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"3.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"062bedcc77df310ecb7be43e69fcd0df0c87b46c","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.2.2","_shasum":"dfe783f1854b1ac2b3ade92775ad03e27e03218c","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"dfe783f1854b1ac2b3ade92775ad03e27e03218c","tarball":"https://registry.npmjs.org/qs/-/qs-2.2.2.tgz","integrity":"sha512-i0PpYJWWhn7DevbolgusRac1ijaEG/jrigNv+WHbTKYWtTqAc/D+6qwAdZ24kZ4ZH3V5hKiqy15ldAplk4V0TQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZH082pnr9wLjkY92q8wv+foT6aFgzGgqnugwIXQkrqgIhANq753WduxX1lFo94K8IC40SMwJN6mie4Rti4NCm3LgU"}]},"directories":{}},"2.2.3":{"name":"qs","version":"2.2.3","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"4.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"904528124a6eb879ebc5197376e9613069414f67","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.2.3","_shasum":"6139c1f47960eff5655e56aab0ef9f6dd16d4eeb","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"6139c1f47960eff5655e56aab0ef9f6dd16d4eeb","tarball":"https://registry.npmjs.org/qs/-/qs-2.2.3.tgz","integrity":"sha512-fn1t1odvsfyCctjhKcMagUJ1LtfvS41///9GOaLBXiUHGsCWWEVFLVCGz9O0UnSn/JcXzCkynaQ22EEwoaDePQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD7FWYiu4PrqPFMpSwVx+XyGKrKDY3rsu9wWgY6HTlwnwIgXCbsDZLVqhoxGuvh263y303bIooEQ7Tp2zobn1KnTDU="}]},"directories":{}},"2.2.4":{"name":"qs","version":"2.2.4","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"4.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"author":{"name":"Nathan LaFreniere","email":"quitlahok@gmail.com"},"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"9775242fa57cbfa4db62e4b0aa4f82b23e2ce6af","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.2.4","_shasum":"2e9fbcd34b540e3421c924ecd01e90aa975319c8","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"2e9fbcd34b540e3421c924ecd01e90aa975319c8","tarball":"https://registry.npmjs.org/qs/-/qs-2.2.4.tgz","integrity":"sha512-ptau9CngYR/IimcThDkAs7LzlZhxo92RiMHtLbOq3R6u9iDkixdSysaAVaZpYByrXWWantEJ4fVPl0xR2McSCQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFT4JFGMJFCEOK+3taTsOI32YqIJMXM44Ap9o2Cd3pbaAiEA1AW8r549hKGO2MUiKuRl6rdlomZQGxXOBCatqY6Sxnk="}]},"directories":{}},"2.2.5":{"name":"qs","version":"2.2.5","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"4.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"211cbd9cd9ba6d16a5459c13073bc3a6b1dec018","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.2.5","_shasum":"1088abaf9dcc0ae5ae45b709e6c6b5888b23923c","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"1088abaf9dcc0ae5ae45b709e6c6b5888b23923c","tarball":"https://registry.npmjs.org/qs/-/qs-2.2.5.tgz","integrity":"sha512-z/IJSH2F7g7FbYokpSQqLcMAk0VXtR8boQS1EqLxeB7T5xcFK/RuGY0PZbPtF9r151X+a/ZaRauCOok4Xiyjmg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICXtSvxDJ/Ymr28xBCCQnwUkXWDwchzjm93Zz3gFulZ1AiAQzIxiQ4FA6rgzoKXn07S3ZXk4t1AC+QSF/xewinavjA=="}]},"directories":{}},"2.3.0":{"name":"qs","version":"2.3.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":{"lab":"4.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"8ace6a435ed0639118ba127c711f2ae8f185314a","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.3.0","_shasum":"ea0c8161775cbb4f3673ad36571b5d5a3f3e72fb","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"ea0c8161775cbb4f3673ad36571b5d5a3f3e72fb","tarball":"https://registry.npmjs.org/qs/-/qs-2.3.0.tgz","integrity":"sha512-UpJkm08AWL8e0SjpToEvCO1XHoEEh6USzRfxbcxf+nZvcmuwlJAFbImmAz2p3/Tyoi004KXg1fHBLwnyC3iovA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICUSl+7oFugk7ygfy9CftOF09frt9UHM0Dc3OANgWt0XAiA4bJAw/SEMVULWdvISnXRV2oMnwD3hni1wuV5oZhJ+vg=="}]},"directories":{}},"2.3.1":{"name":"qs","version":"2.3.1","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"4.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"a601ae18bc419399db7debc2765c96c84e83c237","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.3.1","_shasum":"24e448bc4ee726201995a3c0c768c3bf19494c1c","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"24e448bc4ee726201995a3c0c768c3bf19494c1c","tarball":"https://registry.npmjs.org/qs/-/qs-2.3.1.tgz","integrity":"sha512-hAP601NswVYevOLlkK48Nyx6K5pQHRYXjsLNnXRMkZOqD2THi+nc8EKmdVht/edjaCBtzDqQlYTWs/nXayaySg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9eNngqSDtR+EoEgaw+7MOTT3kCFao7jmTNFiuoXzoRQIgRe+J5Vd3r739Kx6NBx+tS9XfIB0NUy0/0eNtnu/URDA="}]},"directories":{}},"2.3.2":{"name":"qs","version":"2.3.2","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"lab":"4.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"58097c12559b4c5857af99927273b3141dff8529","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.3.2","_shasum":"d45ec249e4b9b029af008829a101d5ff7e972790","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"d45ec249e4b9b029af008829a101d5ff7e972790","tarball":"https://registry.npmjs.org/qs/-/qs-2.3.2.tgz","integrity":"sha512-EsFNiUi2ulgK7BCN0BCijcD1STkbs6YBnsUGr+Yr+3wG/bAZub7XL/BNf2RTyzwJhpA0F2ds6Vr2KVHhSx4hJA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD/GVBIUNGIlzrp39EwtQQF6vrCCq9fFxG0T6DLgLimRwIgTsRi0LxTHHguPDIE/YfuijOuFpZUbLyPweQYrWaAYfU="}]},"directories":{}},"2.3.3":{"name":"qs","version":"2.3.3","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"9250c4cda5102fcf72441445816e6d311fc6813d","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.3.3","_shasum":"e9e85adbe75da0bbe4c8e0476a086290f863b404","_from":".","_npmVersion":"2.1.6","_nodeVersion":"0.10.32","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"e9e85adbe75da0bbe4c8e0476a086290f863b404","tarball":"https://registry.npmjs.org/qs/-/qs-2.3.3.tgz","integrity":"sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH7KftfzwbKnM4lW4uHSwWHGYE9mEdD1DvLRkXGq3QZrAiEA3DugnSB6NGn21stQJ0bGXEbBy8Zy1Tz1lJwOtgdB2HY="}]},"directories":{}},"2.4.0":{"name":"qs","version":"2.4.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":{"code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"820be617369cadbb7b15701dacff3b4cc9a92b84","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.4.0","_shasum":"988dfa14e3ca66b54baa4b754e359f299486e212","_from":".","_npmVersion":"2.6.1","_nodeVersion":"0.10.36","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"988dfa14e3ca66b54baa4b754e359f299486e212","tarball":"https://registry.npmjs.org/qs/-/qs-2.4.0.tgz","integrity":"sha512-zp+W0wCU3/x68eDnBk7vv+tLDNBykL0kwBWsYTMGhhKcdrksHml0FixBzmcgrepQUHtUwnyZLg5SMfAMcBEicQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqWWAlpJFKxib9OKTir7Mel/rDUeG85osb0rjW/DnqTgIgeSWyBcF+75s/YZ/61cLNT+5r9xoSgEC5uI6iISdB1z4="}]},"directories":{}},"2.4.1":{"name":"qs","version":"2.4.1","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"git","url":"https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"licenses":[{"type":"BSD","url":"http://github.com/hapijs/qs/raw/master/LICENSE"}],"gitHead":"58c6540418954867822c1af3e45fb4c26708b07e","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.4.1","_shasum":"68cbaea971013426a80c1404fad6b1a6b1175245","_from":".","_npmVersion":"2.6.1","_nodeVersion":"0.10.36","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"dist":{"shasum":"68cbaea971013426a80c1404fad6b1a6b1175245","tarball":"https://registry.npmjs.org/qs/-/qs-2.4.1.tgz","integrity":"sha512-Be4FpFGGi1EsFqPx6BEjDzTIWVtPlsIwDq0fq52YPFOcSlEX9Nk1ydgfIVjrTxZbeD6N/edkYEPYNwTDcwRn+g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGTQj+yCy00itH/c7Omm8NDOl0dVsTUZIt3dGo16KsTwIgE6WpIxrjsIRynIcsr5T74On8xEYLwrgUGQlPp3NMj7s="}]},"directories":{}},"2.4.2":{"name":"qs","version":"2.4.2","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"index.js","dependencies":{},"devDependencies":{"code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"make test-cov"},"repository":{"type":"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":"cdd64a9d1385dbc3dde48da6de98b5993f1607bd","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@2.4.2","_shasum":"f7ce788e5777df0b5010da7f7c4e73ba32470f5a","_from":".","_npmVersion":"2.9.0","_nodeVersion":"0.10.38","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"f7ce788e5777df0b5010da7f7c4e73ba32470f5a","tarball":"https://registry.npmjs.org/qs/-/qs-2.4.2.tgz","integrity":"sha512-Ur2glV49dt6jknphzkWeLUNCy7pmwGxGaEJuuxVVBioSwQzT00cZPLEtRqr4cg/iO/6N+RbfB0lFD2EovyeEng==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBjHve+f6uWJ6RCAJ11h59L5OhcgvQpRllHvMc5IzczwAiAhFYSU77n5phBfwSx0uRFAtZDLujQuP43Z8RxEYR/rXQ=="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"3.0.0":{"name":"qs","version":"3.0.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","dist":"browserify --standalone Qs index.js > dist/qs.js"},"repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"license":"BSD-3-Clause","gitHead":"482674af2389db626f9ff67c7ae6a7b9ca7a4891","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@3.0.0","_shasum":"bd3b4549424f0960bd6923724eeb29e4ffbc2af8","_from":".","_npmVersion":"2.9.0","_nodeVersion":"0.12.2","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"bd3b4549424f0960bd6923724eeb29e4ffbc2af8","tarball":"https://registry.npmjs.org/qs/-/qs-3.0.0.tgz","integrity":"sha512-W+N2dfclAVHuV7XDXUcLv59WN/BFbSmH5s3O8zyFVZGni4CZRoRFGmTYp97B7orsP44HXd6YmCV8NFeUky2M3A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHmNz/y13NW4d+3MugpxH/6+uk6rzhKTjMdnHjPR8Mw5AiEAzDGJeQmRjimvyPeNlYtXKF7uHW9bukr6Xfq4EyJxbCY="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"3.1.0":{"name":"qs","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","dist":"browserify --standalone Qs index.js > dist/qs.js"},"repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"license":"BSD-3-Clause","gitHead":"e53b1b242a55f886531954ebdd78b3b20efadaf0","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@3.1.0","_shasum":"d0e9ae745233a12dc43fb4f3055bba446261153c","_from":".","_npmVersion":"2.9.0","_nodeVersion":"0.12.2","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"d0e9ae745233a12dc43fb4f3055bba446261153c","tarball":"https://registry.npmjs.org/qs/-/qs-3.1.0.tgz","integrity":"sha512-nR5uYqNsm8CgBhfCpsYKz6iDhvKjf0xdFT4KanNlLP40COGwZEsjbLoDyL9VrTXyiICUGUbsiN3gBpLGZhSZWQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9owcbWzQMH3fh/EA2/PnNlTes0BF94BY5hBW50Ip4CwIgP1fd1vQVymg+7cznx27oQz9iR0Cw38WAYbCRWs5tVtE="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"4.0.0":{"name":"qs","version":"4.0.0","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"lib/index.js","dependencies":{},"devDependencies":{"browserify":"^10.2.1","code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"lab -a code -t 100 -L","test-cov-html":"lab -a code -r html -o coverage.html","dist":"browserify --standalone Qs lib/index.js > dist/qs.js"},"repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"license":"BSD-3-Clause","gitHead":"e573dd08eae6cce30d2202704691a102dfa3782a","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@4.0.0","_shasum":"c31d9b74ec27df75e543a86c78728ed8d4623607","_from":".","_npmVersion":"2.12.0","_nodeVersion":"0.12.4","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"c31d9b74ec27df75e543a86c78728ed8d4623607","tarball":"https://registry.npmjs.org/qs/-/qs-4.0.0.tgz","integrity":"sha512-8MPmJ83uBOPsQj5tQCv4g04/nTiY+d17yl9o3Bw73vC6XlEm2POIRRlOgWJ8i74bkGLII670cDJJZkgiZ2sIkg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID0KVnIumzM4oJcStd8Zxn8Ltx6Rx5XJdEiX54lozt72AiBPgY214d1h6ilOhBRtyBBMgXJJJiIbOUQO1Qoc/t98cA=="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"5.0.0":{"name":"qs","version":"5.0.0","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","main":"lib/index.js","dependencies":{},"devDependencies":{"browserify":"^10.2.1","code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"lab -a code -t 100 -L","test-cov-html":"lab -a code -r html -o coverage.html","dist":"browserify --standalone Qs lib/index.js > dist/qs.js"},"repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"keywords":["querystring","qs"],"license":"BSD-3-Clause","gitHead":"90ac66b2f90dc357134ea138be6cededa1578e5f","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@5.0.0","_shasum":"9e0dcfe32021927b3bca69ecbb9d7694fb9a97aa","_from":".","_npmVersion":"2.14.0","_nodeVersion":"0.12.7","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"9e0dcfe32021927b3bca69ecbb9d7694fb9a97aa","tarball":"https://registry.npmjs.org/qs/-/qs-5.0.0.tgz","integrity":"sha512-ygvqueOBMDyLOAcyG8AkusOl0fuqVZUlqsb5yAMOYwN3QiYRb3LGnR1IzvBIFE/3ggtXxv41zwEF1su2eXAONg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD4H41St+L/MGSNhaWIc25+eqPKGNGbijEPIYuo5L3gugIgMHXSINGeVptA/m+K/GYa5i9999vpTbpew47fU2o9bbU="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"5.1.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","version":"5.1.0","repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"main":"lib/index.js","keywords":["querystring","qs"],"engines":">=0.10.40","dependencies":{},"devDependencies":{"browserify":"^10.2.1","code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"lab -a code -t 100 -L","test-tap":"lab -a code -r tap -o tests.tap","test-cov-html":"lab -a code -r html -o coverage.html","dist":"browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"9e9759ec5be2dd99ce90961bbff47075cd5a8160","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@5.1.0","_shasum":"4d932e5c7ea411cca76a312d39a606200fd50cd9","_from":".","_npmVersion":"2.14.1","_nodeVersion":"0.12.7","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"4d932e5c7ea411cca76a312d39a606200fd50cd9","tarball":"https://registry.npmjs.org/qs/-/qs-5.1.0.tgz","integrity":"sha512-SGDM48EwFLWnYYpNlOkEIRJb4wil5FKJxpR6NVfQjz6qJmX53ki7Xj1cLNEAkb70vUfJmdVLOwODyABgZyDMZw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDh7jqAnU56CT92tU/DczxQ595UcOB74b6CTxlHbQtCTAiEApUwtm/jt4A1VEJG+1jVngTv9COq5xOR8G4Fydo4oTKE="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"5.2.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","version":"5.2.0","repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"main":"lib/index.js","keywords":["querystring","qs"],"engines":">=0.10.40","dependencies":{},"devDependencies":{"browserify":"^10.2.1","code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"lab -a code -t 100 -L","test-tap":"lab -a code -r tap -o tests.tap","test-cov-html":"lab -a code -r html -o coverage.html","dist":"browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"a341cdf2fadba5ede1ce6c95c7051f6f31f37b81","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@5.2.0","_shasum":"a9f31142af468cb72b25b30136ba2456834916be","_from":".","_npmVersion":"3.3.5","_nodeVersion":"0.10.40","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"a9f31142af468cb72b25b30136ba2456834916be","tarball":"https://registry.npmjs.org/qs/-/qs-5.2.0.tgz","integrity":"sha512-VH4FeG98gs6AkHivaW2O14vsOPBL9E80Sj7fITunoDijiYQ1lsVwJYmm1CSL+oLyO2N5HPdo23GXAG64uKOAZQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXcOL4JupVAsmxG/9xRtvuxvV+C69ZPIeEl5RwdQFWRAIhAPK33Ixzm4g+0QlhfKekMWCaYjq5NRbHGUjaHy/Auq5y"}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"6.0.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","version":"6.0.0","repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"main":"lib/index.js","keywords":["querystring","qs"],"engines":">=4.0.0","dependencies":{},"devDependencies":{"browserify":"^10.2.1","code":"2.x.x","lab":"7.x.x"},"scripts":{"test":"lab -a code -t 100 -L","test-tap":"lab -a code -r tap -o tests.tap","test-cov-html":"lab -a code -r html -o coverage.html","dist":"browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"ed169696b6cebacf8e7f7c6b4ba8eeb5f2cb2694","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@6.0.0","_shasum":"de99c0c58c54eae49fff949510672338691110e8","_from":".","_npmVersion":"3.3.9","_nodeVersion":"4.2.1","_npmUser":{"name":"hueniverse","email":"eran@hammer.io"},"dist":{"shasum":"de99c0c58c54eae49fff949510672338691110e8","tarball":"https://registry.npmjs.org/qs/-/qs-6.0.0.tgz","integrity":"sha512-NSkqkwuet8MUAYRb3x5mSbV9uu4gQY85/aksTPi1MHzw6HVBOqUaZEIEhAtRvxgjWsOx+8HvkHOj1NSrZIyi+Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGfLWelL1FZJrO+4Zl7Mg+ROINjmU+TOspjgheHfkhENAiEAhCv94Av3TVJksQFYFnX56gF1oIwoRV0GF4KL8xxtXyI="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"6.0.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","version":"6.0.1","repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"main":"lib/index.js","keywords":["querystring","qs"],"engines":{"node":">=4.0.0"},"dependencies":{},"devDependencies":{"browserify":"^10.2.1","code":"2.x.x","lab":"7.x.x"},"scripts":{"test":"lab -a code -t 100 -L","test-tap":"lab -a code -r tap -o tests.tap","test-cov-html":"lab -a code -r html -o coverage.html","dist":"browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"bbb6ae1bbf8adb3057a52363715a20a25bd8a68f","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@6.0.1","_shasum":"ee8b7fcd64fcbe6e36c922bd2c464ee7c54766c3","_from":".","_npmVersion":"3.3.10","_nodeVersion":"4.2.2","_npmUser":{"name":"nlf","email":"quitlahok@gmail.com"},"dist":{"shasum":"ee8b7fcd64fcbe6e36c922bd2c464ee7c54766c3","tarball":"https://registry.npmjs.org/qs/-/qs-6.0.1.tgz","integrity":"sha512-LcJmRROyMPgjuOvVAOXZIv6yJhQoMtX6yUe8SlmKKw9H/XzZbknXTvPPpJQc0IOb2TbwWoHS/1u4kdFRf022sg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF2alelsOlsAjFdIoDL5IH+ImimGmfLMyZoGU9IC5O94AiEAq89FR66Kj+CXrM8qabuhousYcqi/TLS5NBS7yicnYqI="}]},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"hueniverse","email":"eran@hueniverse.com"}],"directories":{}},"6.0.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.0.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^12.0.1","tape":"^4.3.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^1.10.3","@ljharb/eslint-config":"^1.6.1","parallelshell":"^2.0.0","evalmd":"^0.0.16"},"scripts":{"test":"parallelshell 'npm run readme' 'npm run lint' 'npm run coverage'","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"47dfbd6740b3cc1593847825701c8aa136f636e3","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.0.2","_shasum":"88c68d590e8ed56c76c79f352c17b982466abfcd","_from":".","_npmVersion":"3.3.12","_nodeVersion":"5.4.1","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"88c68d590e8ed56c76c79f352c17b982466abfcd","tarball":"https://registry.npmjs.org/qs/-/qs-6.0.2.tgz","integrity":"sha512-YiYenYVGHv0gA3XHl/pKjfdQsX1wWnCnGf6YBGx1Rtlqwac5XlAIYHd9d8Mf0awAf20bH93igRF0Mae8z641ew==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCg7udr4TaO2AmQv8Z2vdqarH9TXM036IJ1BdfDTdFkAIhAJiO2+PGloxa5Teo2PtE6CsQlzFbtc4EbJfV6lR+TFPJ"}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"directories":{}},"6.1.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.1.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^12.0.1","tape":"^4.3.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^1.10.3","@ljharb/eslint-config":"^1.6.1","parallelshell":"^2.0.0","evalmd":"^0.0.16"},"scripts":{"test":"parallelshell 'npm run readme' 'npm run lint' 'npm run coverage'","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"5bd79545edb33d6a43398fec7df9ecef2da005ea","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.1.0","_shasum":"ec1d1626b24278d99f0fdf4549e524e24eceeb26","_from":".","_npmVersion":"3.3.12","_nodeVersion":"5.5.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"ec1d1626b24278d99f0fdf4549e524e24eceeb26","tarball":"https://registry.npmjs.org/qs/-/qs-6.1.0.tgz","integrity":"sha512-tba7YmUjQg/DN5jDcqe/5AzaoM8KC+/be5/PBU1lxATKSqRAtYB0gK2m4opGb4UHNemmdKAkfy2cjS+TcyOChg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGq3YzpaSN4mmxdHulC+mBNSxhPz+V0ugjo6wtgSVgOYAiEA4xUmP8SW+QcquSWpwQL0ehtt+BffgV1ZRmQ3E521SJs="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-5-east.internal.npmjs.com","tmp":"tmp/qs-6.1.0.tgz_1454565583082_0.44599376199766994"},"directories":{}},"6.2.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.2.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^13.0.1","tape":"^4.5.1","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^2.9.0","@ljharb/eslint-config":"^4.0.0","parallelshell":"^2.0.0","iconv-lite":"^0.4.13","evalmd":"^0.0.17"},"scripts":{"pretest":"parallelshell 'npm run --silent readme' 'npm run --silent lint'","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"d67d315b606c6bb809fedcbeebbbdb7f863852aa","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.2.0","_shasum":"3b7848c03c2dece69a9522b0fae8c4126d745f3b","_from":".","_npmVersion":"3.8.6","_nodeVersion":"6.1.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"3b7848c03c2dece69a9522b0fae8c4126d745f3b","tarball":"https://registry.npmjs.org/qs/-/qs-6.2.0.tgz","integrity":"sha512-xJlDcRyZKEdvI99YhwNqGKmeiOCcfxk5E09Gof/E8xSpiMcqJ+BCwPZ3ykEYQdwDlmTpK6YlPB/kd8zfy9e7wg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCfF46vU8FGoTVqZ/zvYGTzjx/3RUbiczEdS6il4zro+AIgAYx1bHbgtJaPyQ0cAZ16HS6NWM/22L5jKpGu61LLuWg="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qs-6.2.0.tgz_1462749349998_0.03372702235355973"},"directories":{}},"5.2.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/hapijs/qs","version":"5.2.1","repository":{"type":"git","url":"git+https://github.com/hapijs/qs.git"},"main":"lib/index.js","keywords":["querystring","qs"],"engines":">=0.10.40","dependencies":{},"devDependencies":{"browserify":"^10.2.1","code":"1.x.x","lab":"5.x.x"},"scripts":{"test":"lab -a code -t 100 -L","test-tap":"lab -a code -r tap -o tests.tap","test-cov-html":"lab -a code -r html -o coverage.html","dist":"browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"872da25efd167985c153898a06277ef34ce97a63","bugs":{"url":"https://github.com/hapijs/qs/issues"},"_id":"qs@5.2.1","_shasum":"801fee030e0b9450d6385adc48a4cc55b44aedfc","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.3.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"801fee030e0b9450d6385adc48a4cc55b44aedfc","tarball":"https://registry.npmjs.org/qs/-/qs-5.2.1.tgz","integrity":"sha512-sh/hmLUTLEiYFhSbRvkM4zj6fMWnbqQt9wrppR2LJA/U/u4xS2eWN8LBE1xc79ExYZJBVZYSMBv/INC7wpE+fw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDP9ZCg0PjKVneZdUZnPNqySUrLOYV5PErh/BcKOVwlcQIgMSUkKCY326TKOG2plAZJ6GLppmTVRw4QryZYcV+Andg="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qs-5.2.1.tgz_1469043460945_0.553046926856041"},"directories":{}},"6.2.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.2.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^13.0.1","tape":"^4.6.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^3.1.0","@ljharb/eslint-config":"^6.0.0","parallelshell":"^2.0.0","iconv-lite":"^0.4.13","qs-iconv":"^1.0.3","evalmd":"^0.0.17"},"scripts":{"pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"335f839142e6c2c69f5302c4940d92acb0e77561","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.2.1","_shasum":"ce03c5ff0935bc1d9d69a9f14cbd18e568d67625","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.3.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"ce03c5ff0935bc1d9d69a9f14cbd18e568d67625","tarball":"https://registry.npmjs.org/qs/-/qs-6.2.1.tgz","integrity":"sha512-8yYCrxot1tgWocouWKNcewB8VdWuFe1Ab4GU38bg1gGNutR9bMMHaJgxDS5BGRVSLnyRrFhfJ8f04Er/kRmbLg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE9A/n37FZNZDJBRZCJDj2OSlfqKviXELhfY3xftYiEtAiEAiIFIqz4aJivB5HRaBeytsRVr7BbkGWoBIGWl7y166b0="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qs-6.2.1.tgz_1469044929716_0.06957711698487401"},"directories":{}},"6.3.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.3.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^8.0.0","browserify":"^13.1.0","covert":"^1.1.0","eslint":"^3.8.0","evalmd":"^0.0.17","iconv-lite":"^0.4.13","mkdirp":"^0.5.1","parallelshell":"^2.0.0","qs-iconv":"^1.0.3","safe-publish-latest":"^1.1.1","tape":"^4.6.2"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"8aa9c26f90335b5483a4f456dea9acbada8a881c","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.3.0","_shasum":"f403b264f23bc01228c74131b407f18d5ea5d442","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"f403b264f23bc01228c74131b407f18d5ea5d442","tarball":"https://registry.npmjs.org/qs/-/qs-6.3.0.tgz","integrity":"sha512-DR6wXKrnoGWWJvhiPWcvkVPxKd32GQyregSV6XpFG+GplAgmi/wVdJ06s1WP7UCbjiN/YHF0oo19CAUHN4q4BQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8+bs6Cd+5P98tmCkWDa8N6eAFbfZR1hHalVVqansy2wIhANCND86MbxRwGY1YA91WmL3MKfXVa760EnRgbqrzSXET"}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/qs-6.3.0.tgz_1476663988179_0.7400497454218566"},"directories":{}},"6.3.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.3.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^11.0.0","browserify":"^14.1.0","covert":"^1.1.0","eslint":"^3.15.0","evalmd":"^0.0.17","iconv-lite":"^0.4.15","mkdirp":"^0.5.1","parallelshell":"^2.0.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.1","tape":"^4.6.3"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"153ce84948845330d90178cbad982fc7371df538","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.3.1","_shasum":"918c0b3bcd36679772baf135b1acb4c1651ed79d","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.5.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"918c0b3bcd36679772baf135b1acb4c1651ed79d","tarball":"https://registry.npmjs.org/qs/-/qs-6.3.1.tgz","integrity":"sha512-A4Hf32qAqlFeW0jPKgO8CiwK8KMBl9dv0I45752gbWG938IPI/pY7yK6hbBL5L0Y3nh5XeRWJ0MrGlK0VOFT7g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICTcCKaBkKxqvhOKctnhSG6BoQChzNeL0XSCctSPamCAAiAJLfkBV/ThFtM4PEyy88Rpxlr5r5QW0bzZg+oy9DrF8w=="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qs-6.3.1.tgz_1487220058786_0.35462796757929027"},"directories":{}},"6.1.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.1.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^12.0.1","tape":"^4.3.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^1.10.3","@ljharb/eslint-config":"^1.6.1","parallelshell":"^2.0.0","evalmd":"^0.0.16"},"scripts":{"test":"parallelshell 'npm run readme' 'npm run lint' 'npm run coverage'","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"fe86ca45597debd256450e8e7dba23ee61b4569b","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.1.1","_shasum":"9e671fca6df2881dde2e2922479f659752baad45","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.5.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"9e671fca6df2881dde2e2922479f659752baad45","tarball":"https://registry.npmjs.org/qs/-/qs-6.1.1.tgz","integrity":"sha512-YxPtyopRY1w4wI7AhsB3E2ZGewQPE/eHMDjKlLjFP88I+Amky3MTN64dyt7Xn6HLa8CNuWsdPEjWcPArgvBLqQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKRRFbU9OO/VbmUMicXO6oQJDIj7u/eTFoF67dk/cugAIhAKCM9NqF/+3ebH5gVkWFF8tACc9UCT3MahfZvrGBp4lA"}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qs-6.1.1.tgz_1487227305904_0.8775855717249215"},"directories":{}},"6.0.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.0.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^12.0.1","tape":"^4.3.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^1.10.3","@ljharb/eslint-config":"^1.6.1","parallelshell":"^2.0.0","evalmd":"^0.0.16"},"scripts":{"test":"parallelshell 'npm run readme' 'npm run lint' 'npm run coverage'","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"be1c4211a6031cac3443ce66220f4954338bde3f","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.0.3","_shasum":"95f870b23e70268fba18704e80667515905af06c","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.5.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"95f870b23e70268fba18704e80667515905af06c","tarball":"https://registry.npmjs.org/qs/-/qs-6.0.3.tgz","integrity":"sha512-EHZJc+1HhJ49VmoJR1PPu5C7AIeJtc1ai89bz99AIZ1cHIYB4fsKjglCiXgZYlXau5vPVqMI398Ot5pZjEPLZg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5RIAhYrHK8eBVC5WLk2YVh5CQ/zF6zmNLbmbj+e7uuQIhAKL/TM+/HeRX+/UEKPCE7M+Nk2ER0oKHkTSB/DVm/mT3"}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qs-6.0.3.tgz_1487228751019_0.30726271285675466"},"directories":{}},"6.2.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.2.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^13.0.1","tape":"^4.6.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^3.1.0","@ljharb/eslint-config":"^6.0.0","parallelshell":"^2.0.0","iconv-lite":"^0.4.13","qs-iconv":"^1.0.3","evalmd":"^0.0.17"},"scripts":{"pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"cafa12484f4e2f5318c0f108cf17b50233701427","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.2.2","_shasum":"d506a5ad5b2cae1fd35c4f54ec182e267e3ef586","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.5.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"d506a5ad5b2cae1fd35c4f54ec182e267e3ef586","tarball":"https://registry.npmjs.org/qs/-/qs-6.2.2.tgz","integrity":"sha512-ZQ/RV/2Xt6cEDP9rPehKP0C2SIg4guXSjGFsKdVPzWSsvAVaS9q4e6gTirvagGOKFYovRuQNjsZJ19WPdOlqZw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEpyMyUCS67duiUJkCic9tl/8V04Bl+8JTIOt6sNlmZzAiEApWuSnCLpukcevqhCbnA8F4/Za8reOKXz3ZurbUL4ywI="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qs-6.2.2.tgz_1487231073987_0.7608081009238958"},"directories":{}},"6.4.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.4.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^11.0.0","browserify":"^14.1.0","covert":"^1.1.0","eslint":"^3.17.0","evalmd":"^0.0.17","iconv-lite":"^0.4.15","mkdirp":"^0.5.1","parallelshell":"^2.0.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.1","tape":"^4.6.3"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"c7f87b8d2eedd377f6ace065655201f51bee6334","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.4.0","_shasum":"13e26d28ad6b0ffaa91312cd3bf708ed351e7233","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.7.1","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"13e26d28ad6b0ffaa91312cd3bf708ed351e7233","tarball":"https://registry.npmjs.org/qs/-/qs-6.4.0.tgz","integrity":"sha512-Qs6dfgR5OksK/PSxl1kGxiZgEQe8RqJMB9wZqVlKQfU+zzV+HY77pWJnoJENACKDQByWdpr8ZPIh1TBi4lpiSQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDsM07aGUH5sSe88aShOzeAiPsIvyhpunqjEx49DUa1OgIhAKz2CHXk7VUikQXtAB7RVlcCOtGv8P4/UeboxwsL6Ayn"}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qs-6.4.0.tgz_1488783808282_0.7979955193586648"},"directories":{}},"6.3.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.3.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^11.0.0","browserify":"^14.1.0","covert":"^1.1.0","eslint":"^3.17.0","evalmd":"^0.0.17","iconv-lite":"^0.4.15","mkdirp":"^0.5.1","parallelshell":"^2.0.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.1","tape":"^4.6.3"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"9ee56121311dac6b6014bfe56b3df0ebbf4ed048","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.3.2","_shasum":"e75bd5f6e268122a2a0e0bda630b2550c166502c","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.7.1","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"e75bd5f6e268122a2a0e0bda630b2550c166502c","tarball":"https://registry.npmjs.org/qs/-/qs-6.3.2.tgz","integrity":"sha512-H7Es34wXu+JjuD3QLwVgqtVU1nisFhwxYdYCYSFzWyP5/S4s8DtJ6rbVWdHVat/UPYiV36wxYmL7rPbLQJrX7g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICjrutMIqmARhLxaoyHZr1jM0inIrqy9QKtq0cFJ8zeSAiEAi9e0jyCipu0/xR5VAhjKE248AEpWwqhT9QE0fo7jjCs="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qs-6.3.2.tgz_1488790933355_0.4183437137398869"},"directories":{}},"6.2.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.2.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^13.0.1","tape":"^4.6.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^3.1.0","@ljharb/eslint-config":"^6.0.0","parallelshell":"^2.0.0","iconv-lite":"^0.4.13","qs-iconv":"^1.0.3","evalmd":"^0.0.17"},"scripts":{"pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"1fb74cb66310c506e4b6bc04fa258a1759750222","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.2.3","_shasum":"1cfcb25c10a9b2b483053ff39f5dfc9233908cfe","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.7.1","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"1cfcb25c10a9b2b483053ff39f5dfc9233908cfe","tarball":"https://registry.npmjs.org/qs/-/qs-6.2.3.tgz","integrity":"sha512-AY4g8t3LMboim0t6XWFdz6J5OuJ1ZNYu54SXihS/OMpgyCqYmcAJnWqkNSOjSjWmq3xxy+GF9uWQI2lI/7tKIA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNBVjWTuqdaib4Y1TWiAvpBy0oIQOS3gJqb/JTnOTGBQIhALsipnsbc25Hey1lJCSDBMpz4Xgs3Gp3PvHAE+I0My3l"}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qs-6.2.3.tgz_1488819027828_0.679028207436204"},"directories":{}},"6.1.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.1.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^12.0.1","tape":"^4.3.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^1.10.3","@ljharb/eslint-config":"^1.6.1","parallelshell":"^2.0.0","evalmd":"^0.0.16"},"scripts":{"pretest":"npm run lint && npm run readme","test":"npm run coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"68ca039dc2b23b9dabff79a34a906b56c17addaa","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.1.2","_shasum":"b59d8925d0c999ef6d63acf4ac5abb0adaa24b54","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.7.1","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"b59d8925d0c999ef6d63acf4ac5abb0adaa24b54","tarball":"https://registry.npmjs.org/qs/-/qs-6.1.2.tgz","integrity":"sha512-vkyEo9cSlcgr1xj5n14ykoPWKE36R8wkxK2fQkbGACZNv4zDGFw/juEwFFUs9/APU7DaTMRlRNTYISLPD0Z4Qw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWXZUxE+DOWuWzBaYwZ3zaVzrbJjGdJvuQX0+WC3xe0QIhAPrqEJ0z+tJGx7ejswXHpfucyB/ECRLqub1g2ipTcdF9"}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qs-6.1.2.tgz_1488819050129_0.8727251156233251"},"directories":{}},"6.0.4":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.0.4","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"^12.0.1","tape":"^4.3.0","covert":"^1.1.0","mkdirp":"^0.5.1","eslint":"^1.10.3","@ljharb/eslint-config":"^1.6.1","parallelshell":"^2.0.0","evalmd":"^0.0.16"},"scripts":{"pretest":"npm run lint && npm run readme","test":"npm run coverage","tests-only":"node test","readme":"evalmd README.md","lint":"eslint lib/*.js text/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js","prepublish":"npm run dist"},"license":"BSD-3-Clause","gitHead":"10233c9f92a4e3537009fbfbd0baf6f3738c4551","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.0.4","_shasum":"51019d84720c939b82737e84556a782338ecea7b","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.7.1","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"shasum":"51019d84720c939b82737e84556a782338ecea7b","tarball":"https://registry.npmjs.org/qs/-/qs-6.0.4.tgz","integrity":"sha512-zTqfwnNxm6UUH0mxoY9TRHavimMmNp1YZwCIO3oQbEbuQWDXo/yhigCah9Q3KTerKxlVvK3RaTdJD7dHBDBptg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE6C9A7QVyFv7viWuimKmCB/j/uL8aami2ROtg8sbU95AiBWGgsJtKZackdJ2XA04lZ7XThMYPugGboQXZ8J/7WBow=="}]},"maintainers":[{"name":"hueniverse","email":"eran@hammer.io"},{"name":"ljharb","email":"ljharb@gmail.com"},{"name":"nlf","email":"quitlahok@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qs-6.0.4.tgz_1488819105955_0.938799966359511"},"directories":{}},"6.5.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.5.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^11.0.0","browserify":"^14.4.0","covert":"^1.1.0","editorconfig-tools":"^0.1.1","eslint":"^3.19.0","evalmd":"^0.0.17","iconv-lite":"^0.4.18","mkdirp":"^0.5.1","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.1","tape":"^4.7.0"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","prelint":"editorconfig-tools check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"d66ac175bbf8afa44b41c2c85b04ae00bac7c916","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.5.0","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"integrity":"sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==","shasum":"8d04954d364def3efc55b5a0793e1e2c8b1e6e49","tarball":"https://registry.npmjs.org/qs/-/qs-6.5.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQPVNSjQ74K2JVvPhGfVQ/Yhp0BZaI0Cy6Px88j4i+EgIgA1S9ZEA8P9JJNA1FU6m8OanlPJZUwK3T0Wpupz/+/p8="}]},"maintainers":[{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"eran@hammer.io","name":"hueniverse"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs-6.5.0.tgz_1498633673933_0.663175018504262"},"directories":{}},"6.5.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.5.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^12.2.1","browserify":"^14.4.0","covert":"^1.1.0","editorconfig-tools":"^0.1.1","eslint":"^4.6.1","evalmd":"^0.0.17","iconv-lite":"^0.4.18","mkdirp":"^0.5.1","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.1","tape":"^4.8.0"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","prelint":"editorconfig-tools check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"0e838daa71f91fecda456441ac64e615f38bed8b","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.5.1","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"integrity":"sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==","shasum":"349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8","tarball":"https://registry.npmjs.org/qs/-/qs-6.5.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICj9IC3R31alRj7yz7sO7/17V4mszkDxn7UiVp0LsYT9AiAfud7+rcnne6mYRe8/UUikqLr878mXpPAWf0O8TdOUFw=="}]},"maintainers":[{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"eran@hammer.io","name":"hueniverse"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs-6.5.1.tgz_1504943698164_0.10575866606086493"},"directories":{}},"6.5.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.5.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^12.2.1","browserify":"^16.2.0","covert":"^1.1.0","editorconfig-tools":"^0.1.1","eslint":"^4.19.1","evalmd":"^0.0.17","iconv-lite":"^0.4.21","mkdirp":"^0.5.1","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.1","safer-buffer":"^2.1.2","tape":"^4.9.0"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","prelint":"editorconfig-tools check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"eaabd05558b657c75a137caf2eb030e8e856b82f","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.5.2","_npmVersion":"5.6.0","_nodeVersion":"10.0.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"integrity":"sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==","shasum":"cb3ae806e8740444584ef154ce8ee98d403f3e36","tarball":"https://registry.npmjs.org/qs/-/qs-6.5.2.tgz","fileCount":18,"unpackedSize":114127,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa6/hXCRA9TVsSAnZWagAAEJQP/0c3B2SWDmhz9zC9na++\nc6v1YkoIPJ+IhVaFhrpKvT3HeMsRbdQFTjGJ+7VijncHdxuieAGSAo5Tm9MZ\nnrskliXl61TelWC3/1GJ7hzggBCIudwf1Kl5P2lx+XLTBag+B3BnfxR+Gp/o\nF8f+CJ3I2KxkKZWcHYBTLLgE5dPi5i5KFnh9EAsaZRUiowCDl+CaKzj3u55M\nUfwKrUXLfZtgL3ALj5Nh/g1F+NW7m7RIDREVFPJ3MqeiNUXUnGU9KBmQuHMm\nWvOMuvN9vgPm40fp9TBZQlEazaR12QBqqvpgDtYBNqfUQaznoyZ8rN36W1oB\n5iV3Ve6B+BeIPNMaf92TvAnbvLcAEfy36VuOiH3IHDyEDAk706n/etInNeYS\nK/N359uzbRCQ7MQTJ5Z9TmlsD6/TFRfcBcGUrnPoL6HEEIxmAnJbKApy1sP4\nqb/GnrOQMuRJ6ty58aTEzotFvsxFw8kaeeexZ7Ftd7cKYdBRjutfiibJTH3v\n8feuHS0wDXRDvVd906qwYvC4LwGeqTJeRUHtFrd3pwCDqiXGyEXP60Yyir6L\nqZIYxzv8FRBspN//x5YJndpU06joflcCmm0bLfu+zLSevL4eciH+ciBQZQVY\nzWdcWZktjGXNt5I1s7xO31sgV7nwiXSPUQDS/SuaE860GWQ9pp0yL9M23S/q\ny88W\r\n=156t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA69UyoQ3ZswMYw2PvQIv8HOcpaQAMkbsfJTjQyyoZRJAiAB7cLfjjupQoMULn6gBztSx8C1J8Hb429XAqSVHkP+7w=="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.5.2_1525413973776_0.4130968177833936"},"_hasShrinkwrap":false},"6.6.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.6.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^13.0.0","browserify":"^16.2.3","covert":"^1.1.0","editorconfig-tools":"^0.1.1","eslint":"^5.9.0","evalmd":"^0.0.17","iconv-lite":"^0.4.24","mkdirp":"^0.5.1","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.2","safer-buffer":"^2.1.2","tape":"^4.9.1"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","postlint":"editorconfig-tools check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"34af57edde61639054ea7b38fdfce050cffdab29","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.6.0","_npmVersion":"6.4.1","_nodeVersion":"11.2.0","_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"dist":{"integrity":"sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==","shasum":"a99c0f69a8d26bf7ef012f871cdabb0aee4424c2","tarball":"https://registry.npmjs.org/qs/-/qs-6.6.0.tgz","fileCount":18,"unpackedSize":134583,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb+kTaCRA9TVsSAnZWagAAoKgQAJ3yaFKHAZdEPsXsO36H\n3uSKGYfSd8+QqDXMYkOQIWfUtFQiscARQbWHctPfd07zdfAgYMx6Gx2N62qz\n9VJVFPe5USaoV7Y6uRFeOwsnh0qcEwOF5worq/rCNhIctKl10BBVAhQe84e4\natanjbg3l2WsIKv+4MjFs890dOB+gXNimoXYP4KzJvUTOplbIETbfFYcMI6k\nrR9Gu6zVriEqF5j/R1WWwAICFYK9+vF7QY1BVLhP/Xxu3vdI1e88j5BPx9Jf\nZ4b2v+S12Fqoe3iiDYmqTdwHrEAWUkDxJswWKKkP4JrH6D/rgA3HKVAQgs+y\nI6O+Fznr6zNPnwAowRw9y0FBIkBWgvHOAbbmG5tjkLDqB/7jmzMWveYU1hMI\nHCLoYtZ4oj/dUDGxWMQssDwdIQrNwWa+c7ZByKDisvzQwY70BI3whckTFYWj\n4onUR9nGCzsHPd0HYu8iVEU2kMil3xQLl5Zr/XPZsx4rLwtXD2SIIlg7YXVn\n3UzkGAKvsICOla+XoMUZgSbwHu8yoHvPGQOX/+8SvUIitbBbX3ADoWoTTclh\nB3KiH/0QbdXUMyAolVwA1sNhhb7mIXKAsg8y9NvyhtZ5B2ZIN1GMomqub68v\nQ+d+rVWtgRe13rJCQ0kx0SpzmaXd96PkoADsYibXM61hBnxBYKQSSydhVShD\nPWXC\r\n=NVkV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCb9rMi9mVdSbO2499hrPbLTp9aUgNP5OkIJCSp99NVNAIhAOEmg3oVLf8DxcIFZQf60dKX2NzJCic5O5I48iZMJBrt"}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.6.0_1543128281582_0.7909573175660216"},"_hasShrinkwrap":false},"6.7.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.7.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^13.1.1","browserify":"^16.2.3","covert":"^1.1.1","editorconfig-tools":"^0.1.1","eslint":"^5.15.3","evalmd":"^0.0.17","for-each":"^0.3.3","iconv-lite":"^0.4.24","mkdirp":"^0.5.1","object-inspect":"^1.6.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.2","safer-buffer":"^2.1.2","tape":"^4.10.1"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","postlint":"editorconfig-tools check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"125e103b61f2bef245970f5a2a8dceffe5aab59a","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.7.0","_nodeVersion":"11.12.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==","shasum":"41dc1a015e3d581f1621776be31afb2876a9b1bc","tarball":"https://registry.npmjs.org/qs/-/qs-6.7.0.tgz","fileCount":18,"unpackedSize":142918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJclUozCRA9TVsSAnZWagAAoroP/0PHjSUPNl7JIbIdKciJ\nBCTXasz49hv66gp1crSOmRPut07b3ao8gfYA4asdVauyJUteb9LtFqDOcvz9\n/VXV7XU63SnJIF2tsWV5sRvLgX4NgQzViijUH5XuE62potDawIa6M2i4zJTh\nWO5OSmizv/ODNCkoNw0tNiriB9sqQ1hXzcWg55geAWy4COB5E0+OvWKV9j/x\neAHQVUKBJTfNb+SsN8YqtDK9Dp+rGy0VCKn606FWu/l79sK4JvMYdpDpRliE\nX546lMOEzYZDDH+2Yq7n365PKV2pDzomRSoJnPWDimz6AbKDy0MIKpXQVmhi\n52MjXPgHhCntt2ETQToj6yA9Suy4DQ1nxtZtDdudMxr+4hqJShBhgMGTqpX6\nMS9wBP5CisDzpzHglcH5gRvDF4HLJU52/AXk2hECQsfVPTQx4R6gl/c0jCRQ\nIo7bBcFPaAsYQUjfo7PiOpMUZX5T1STBXAS7rN3tf02OBpnWD38xNu9t/6hI\n5HiurnlTVCUxajdGSitX0JZKDTI7bskIoiXTDMQxT3ppo1aptzP+9ZGiUZjz\nJRVD6LAC1PFC0cFXvlo0ZNbh0DxgiIHOCMpveS/8uh4KdZaWjnbhoMRTRgi+\novatKeu2pqLJqtZkh+016+dRR8QYDsFVDgRPc3qBOmMsR1CZ2E54euLpoFzf\nRfi3\r\n=ivNL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC+PfFMzZGcgoP4xu8wJH3oHjGmkiwDDVVW60Mbg6Zr7AiEAlJlAvbk8Y05QTRY/oJmD9Owwrysu1dffn1doNpPfz0I="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.7.0_1553287731018_0.8639544724083812"},"_hasShrinkwrap":false},"6.8.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.8.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^14.0.2","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.1.0","evalmd":"^0.0.17","for-each":"^0.3.3","has-symbols":"^1.0.0","iconv-lite":"^0.4.24","mkdirp":"^0.5.1","object-inspect":"^1.6.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.3","safer-buffer":"^2.1.2","tape":"^4.11.0"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"57657fffc89c4dafb830ee78ec79892a17653eed","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.8.0","_nodeVersion":"12.8.1","_npmVersion":"6.10.2","dist":{"integrity":"sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==","shasum":"87b763f0d37ca54200334cd57bb2ef8f68a1d081","tarball":"https://registry.npmjs.org/qs/-/qs-6.8.0.tgz","fileCount":19,"unpackedSize":148758,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdV2pQCRA9TVsSAnZWagAAvyQQAJDQK8zkD7AjVqr8BYy6\nc/fXvt1TxD4m+5T4vUMuGisTN4nEW86ugHrvuG7sfLCTCySQyNo6xdHVz6ea\nDLzH9PUCWM8R1OWmyXQ5kyyJItqVG9kkeTUer9s09hqEtWz5vuCGS9rq0J8F\nc8gjynqBpAS9UkoyMvP22fV+e/L2VXYXx7nndWpkm59DQsohreHsNDWr3F9A\nwAqmW7eVG57Ls66ukfvoWXPRA8jIVpRuysf6s8RpSOxrZiYUTmyWmOZHWTHk\nWi16XxTvEWwr0wvPhozMK4tOA95iMh2kneo5gPckFBpEKqHwKJJAfoq8jbcg\nH+/kxik3KKblHgO9wWpeSfZHyZFKjZec+W50FcNQfcfUd3UNU3ONRGZKRz5D\nqwB8La11JkMYGOAQYEOuOtCNRlCdfhqMlcBTVjsPx9yck+/afjTy5CUch5R4\nkuTdPEheAU2xldRz6QSYASY+w5i1zQXex6bF+JzA5zwtaYVtWlwIz8HraSZt\nMaOkNLw9rw/mlz2VwfEwoZJOoCzF+ceUUxrWo+vILmGbn0dXjQH/6P/w9KID\nCTNj0Y8Lg7XVjcxVWGhvmwpco+uCRl3bgzH9VwRgrK9WztIGnbyBrJ4FM2+d\nC7Dh+rXqi06LUAIU9+vwtiwRkB7KH2HpOW0WRnPUUXihHZFeITsMTANmlMGd\nRdqb\r\n=cmSp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID/L21OV8n45fRKoel34ohZNxxq8EBSvR1L90kMc2RAgAiEA6BwHkeihtGXUvENlsVo02AvfDeZBWG1+FElBKB+GQHo="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.8.0_1566009935569_0.19894011235292686"},"_hasShrinkwrap":false},"6.9.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^14.1.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.4.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.0","iconv-lite":"^0.4.24","mkdirp":"^0.5.1","object-inspect":"^1.6.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.3","safer-buffer":"^2.1.2","tape":"^4.11.0"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"670254b63fc7770894eed9a0f020bc0b72698ce3","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.0","_nodeVersion":"12.10.0","_npmVersion":"6.10.3","dist":{"integrity":"sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==","shasum":"d1297e2a049c53119cb49cca366adbbacc80b409","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.0.tgz","fileCount":19,"unpackedSize":152366,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdhqOLCRA9TVsSAnZWagAA+G8P/2ZsKpypA7CIMTYunSSg\noTo57Pbg5Dg5Wsb1x7gF3IfQmmUTgN9ixJOanhshuYdbd/pZ7bohHZnyoQ0U\nGnWOligjyvuQ5uK5cvmOFNh7mA8eeurkZmqNIaTWNru/7GHUoP2XYw8JcxRe\nKBK4kdcOCEzECgv1pCG71+9MzaX9G5S+l6jzSP0j3N06MG1wwbVIHYbN6RWo\nrmVTL2qdUT9XV+vK7mG5ygjIXF69DRY0jLPn9RRhCQITEQsVXabgkPSR+h26\nu5WkoM3thItPYA8/txhJfOxOyYgDgHNyiYCiWpVeNo+nl7M7iqDMUO9xplfC\noxdRa8ib5MjC5vmU2Bl6z7MFSHGgFEav+jEhm6TPQz7vFnAoYscxLzJGbPnD\nO0shqFPPZUNCl2M/RDX7vpMb/5QFWX2NJEmMP/hfMOJ+yT3atTd06E2tnn5i\nsywEKi2UJb61gOP6KJ4FwFhu5W/E4+W6kFgMv/L+6D31ycEK+E/G9hNOZNIJ\nbrXzI38eVdbMSpkO7Ss99m696Msphd5j9hy25wVzTu0g/8Krdd1vlkmQz358\nKnLUqlBkmhdbvGahT4tbW9ldKE4Fp/rEiByZDeY6hFgqjmfiAvTLx+AyW1/v\n02M+O9GtV2P9N1V9fpwC7IMw6UDrDHXZZQnwkcXCEyJM++/ooiu6YohFXIah\nzeO7\r\n=+2wp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJYiFYWNLeTKTGBeXik0zj9OpTpUwKZzY2xo9dGSoN9gIhAJqfNf5UR9QxwsRf92Qd3+kVCLb0AKkmaD45i2TAScuG"}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.0_1569104778997_0.9699639598156031"},"_hasShrinkwrap":false},"6.9.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^15.0.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.6.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.0","iconv-lite":"^0.4.24","mkdirp":"^0.5.1","object-inspect":"^1.6.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.3","safer-buffer":"^2.1.2","tape":"^4.11.0"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"7b368004723b8d11d4d237ff0479b9edcfb41449","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.1","_nodeVersion":"13.1.0","_npmVersion":"6.12.1","dist":{"integrity":"sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==","shasum":"20082c65cb78223635ab1a9eaca8875a29bf8ec9","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.1.tgz","fileCount":19,"unpackedSize":154259,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdxQ9LCRA9TVsSAnZWagAAg0MP/2iGAM115NBWii9uxv1I\nMtgS6Q7RE2woj0nyK2MevzHyiBVv3AsytXhVxzAodz2Vv831O1wjTMR8g5l9\nvzx3YGTKghVUnt1ElBUCSh36LXgzahqMJV0BwS9mv/Bve4UUilxKOuKTndSy\nbCFXacaUJW/iPZFWMGo3NSOanHSedVESJR9uIfzIfnY70iQcoMnX3aEGiOwB\nGBA/U8oE+5DfNgZDjnAtEpqOjLdPRpV5Z5ug5gqnsPKqMgqW65p70hO+nFro\n9X0C58z24gLgig7llaRgvjIAP15607L/0FHn30G2p24RTAPlAHw/PfIw2lje\nQBf377T75OGlKgOEmy8wB76EUzAkk4mj6Y44IuNBO9NMeWuyKXyEczwhAIy0\nClMMNA2AIGoIBYmd3OOn0Wy7DGEr0VGLfEokwmzPLtu5E6QUkhlNa5EJQv9f\nyT3Q+vTxe/VsOMYFLyzJdXSo472mpSECau0W3Sre4ljMf6Zw386FCR7uWG03\nrUfzc6TDhkLWQBFYglbvOQ1AANdEmLXR9k0Gf+kRVm4cdlvV6EYeqrjqj203\nBqiJJ9MiDP5g3v4ol0dLN1HwgpkTH8TGsxlkdBb8mxVJiu+Xippp0T2zM1qK\nMwwICHod+pqlP0RSn4n4OVacWE78O3EgTTta+DD2musaBZFl5uQ4tKGXdfxV\nXm6H\r\n=JS/y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkma1Hl8zRbi/UPc2glvkaZ99MsNO5yF+NyY0F10fRFQIgMev+r/L4MayHIxEUcTh2QnQRZ109OLEzePTAdeOGd2I="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.1_1573195595196_0.762870404228227"},"_hasShrinkwrap":false},"6.9.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^16.0.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.1","iconv-lite":"^0.5.1","mkdirp":"^0.5.3","object-inspect":"^1.7.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.0.0-next.5"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"ddc1ff9ca16a4b8963d7cf72d0a881732e54b8c9","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.2","_nodeVersion":"13.11.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-2eQ6zajpK7HwqrY1rRtGw5IZvjgtELXzJECaEDuzDFo2jjnIXpJSimzd4qflWZq6bLLi+Zgfj5eDrAzl/lptyg==","shasum":"a27b695006544a04bf0e6c6a7e8120778926d5bd","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.2.tgz","fileCount":20,"unpackedSize":156197,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJed4a2CRA9TVsSAnZWagAAkdYQAJD//C2bHvQBOCI2jdDA\npeApeGwW1ZNW0Spp5jUZDDBE5Qje1BAu34vO/gwUF74YHDi/4ahNrbS/nr8R\nf+gjma8ixf++yFYAX/OO1G8Mik/vrqDtfH095uptBmiX0pMzTQkBYjYoCcW0\nyCP9MZUDq0yJ0o3u/t5iI4Xnnc9UEfi8P4H641zzRYNMpIzxUHwTgjIugevI\nX7LNTJABc7x+Ge75GSHhTCEyzAzFXJA7DJNQJDWyx0zb5wQQHl49ebtIdvhc\nHlJIH0xzFFiptAGBSdqeU3CRIBoqSU+0yPPZWtJZTE0J+D66N5flBVeKvQ7w\n4rI4elSmLXazBqMELaccr3ubQ7KTXTzfoNeUlCFu0joKOt7KBI8bNIHY2AtY\nfnB5UgdC7W5/cdphxJ9MdYafplU6/21yenAODpt6Z9Hzt2nZGFAjQnpyUPoQ\ng8owsezO2gJ4+egEmRlMaUIpop3Tnyll3Ga2vGMYIp4DdePvdsm5kvtZwPnK\nVZUx1YWJOP5m19tjgNWrNqk3ov8suRCnl4BRFG0LJbMde6/ebHI+m+RZeCG2\nG/zKEEK+a4YxGsHUq+UhetA6ZISDlZFwWqjvBuq3/OfctTeRaAtp+8CbbwKu\nyWEhfYNQ30m5Q4pKKmfM+YYotuW13uwOb75CGTlhn0nhHvRYLf/yHTKd3vOb\n80dy\r\n=2eTK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCABG1+BtMZ/76J6mskwBf5GNIUlW+L/fbem9JnDz8Z4AIhAIuNnslAp2Nu7nZCCa7zLqhokKYgHpeLMSJpbjlOZU8T"}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.2_1584891574201_0.7623260847733633"},"_hasShrinkwrap":false},"6.8.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.8.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^16.0.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.1","iconv-lite":"^0.5.1","mkdirp":"^0.5.4","object-inspect":"^1.7.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.0.0-next.5"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"b57d12a37d20d13f34ce1abaf749fb5357976742","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![Build Status][3]][4]\n[![dependency status][5]][6]\n[![dev dependency status][7]][8]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][11]][1]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[1]: https://npmjs.org/package/qs\n[2]: http://versionbadg.es/ljharb/qs.svg\n[3]: https://api.travis-ci.org/ljharb/qs.svg\n[4]: https://travis-ci.org/ljharb/qs\n[5]: https://david-dm.org/ljharb/qs.svg\n[6]: https://david-dm.org/ljharb/qs\n[7]: https://david-dm.org/ljharb/qs/dev-status.svg\n[8]: https://david-dm.org/ljharb/qs?type=dev\n[9]: https://ci.testling.com/ljharb/qs.png\n[10]: https://ci.testling.com/ljharb/qs\n[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: http://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: http://img.shields.io/npm/dm/qs.svg\n[downloads-url]: http://npm-stat.com/charts.html?package=qs\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.8.1","_nodeVersion":"13.11.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-9dsXTOm8lzTvKIK3qv6P+5RTyADROs1juUsJ4SsPG50o3I7eTqzLXt8FuneLMuD8pcfy+jO9Qrbd7kjINfyXVw==","shasum":"65912fcd52e194951986eacddeecbbacd9c23059","tarball":"https://registry.npmjs.org/qs/-/qs-6.8.1.tgz","fileCount":20,"unpackedSize":154171,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeeZD1CRA9TVsSAnZWagAAqZAQAJQ2czj3M2yy8g5rPFzD\nbZwx2y9fnhj9SzM5W3KPxmD3yOyJrKpi5tRxy/gxDfBsP0n2F3+ZTTFA2NBw\ngZDWRw6Yi4HOVyO//b5tyZ6YMzlyEpD+HsKVGiz2F844x143EEYRmYrZpTZ5\naWMwS5HgngC/FBFaZr8RhMQmIvSb63L1IO+EDZgdUxodn4B6X2wxvGXq0Cld\nJiT//gWbB/R8UWb051TF1T9hEozR1+9CcAff7Cq3tzw/eu7Gz/Y8DUhBfHPo\ns7UdxUhLzylqax+nM7E/JPh2XObqBQEO+FTLL+rMMWlbk237O+sKQpPO7IbL\nHLo3F9GScW1eHKusb3s/uQja8nrvroHKbVyYNtmia3UIHQpXfDkLj5IzzIDY\nZzNP9DpUPS5KCZIiuJud5o7JX0mTjH+/ImjLXb0uIwvkLqR2IxT/poeKRoYA\nhFPGbVLpGKsDLwD13zx5AhRlUaho7HoyHE2cGT24Sux4HVXQzsQPKLzA4VLp\nO6xmVWmzsRafGr3W5sMIcuG49KX2uOs3X1CRKdB7ldwbwpZLlSGW8xt43RFn\ntC1ixa/0x6GXxlAhLwlClsmG7ifUqRPAeZ+EXsoSfN4ulta+qHqn9iY3aUwL\nOGofo3N4XjPGD4et5RKiPdyRfzib7mFuiO6YDtn6OJRiOv/GVEoyopRDZREv\nzCU/\r\n=ILTl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPmKTJukplxLRFHa9sOEKgOqrqY6w6RvjsCw033uE5PAIgBrJx4mVct9rcoYq62xf9Kct6sSWRr71eohX58MglgOI="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.8.1_1585025269126_0.43376637224066505"},"_hasShrinkwrap":false},"6.7.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.7.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^16.0.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","iconv-lite":"^0.5.1","mkdirp":"^0.5.4","object-inspect":"^1.7.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.0.0-next.5"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"92f97f25e40bcc7cb3396ddc2ea813bcac0b4dac","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![Build Status][3]][4]\n[![dependency status][5]][6]\n[![dev dependency status][7]][8]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][11]][1]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[1]: https://npmjs.org/package/qs\n[2]: http://versionbadg.es/ljharb/qs.svg\n[3]: https://api.travis-ci.org/ljharb/qs.svg\n[4]: https://travis-ci.org/ljharb/qs\n[5]: https://david-dm.org/ljharb/qs.svg\n[6]: https://david-dm.org/ljharb/qs\n[7]: https://david-dm.org/ljharb/qs/dev-status.svg\n[8]: https://david-dm.org/ljharb/qs?type=dev\n[9]: https://ci.testling.com/ljharb/qs.png\n[10]: https://ci.testling.com/ljharb/qs\n[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: http://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: http://img.shields.io/npm/dm/qs.svg\n[downloads-url]: http://npm-stat.com/charts.html?package=qs\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.7.1","_nodeVersion":"13.11.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-1wsZD0q8V7+olrPgA3LN04JXXJbvv2p8BAwIO06w+4ITT7xVOG0+5tAC18GrGPLvhr0tGN+jtoHs7mDa+yQVlw==","shasum":"856b51bab68c7228db9b26f8339b84bad935877d","tarball":"https://registry.npmjs.org/qs/-/qs-6.7.1.tgz","fileCount":20,"unpackedSize":151905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeeiZjCRA9TVsSAnZWagAAI6IP/iuZvjvvBtyvlZJ7iTk6\nhevuH7NbhujgMD5PfTGiJ6t8oh19stOzTWbitLD7OOtCHSV2kId7uORhIv/O\nIt41cumdro/O51R7JmJ65lg7U7tSnikamPxF1pawlXtvO9YcXTVgGMwiduIc\nOcssJol6d6oIn9I30WtrWQ6LOwvCnjzOw6Eow22J92pJhJ6MHRMfb1EAVsYB\naCoXu9Ff9LnFX8Np5KROT05jiWHAsdbPjua5bteaqVnBOMtnTFzNkr/NCr16\n9y9aYdaUChBz7Ekb0ElPS4VGTeLHsrYOXaVNAWlLG43ivFOowDQyVbeM7dt0\nQ4/FRY8mOl2ZO0d45pCk7XFvwbqAoLDx+OPvYrqcbagihA1uVj5R1nVv9XxE\n7lIda/nQGB5xFWdiUj+L+zA5CPVzyxSFKLYNfWmULwoF8MjBf0zBXjAJPW5e\nKel71ggLlGmPs+Lg2affE13nVvo9gNbQWFHTHvNrYlue5Mb88OABJhTmLJA0\nU0JR75uNd/voLh/BIIxU6TzgikKsbbf1Zlt3GrhX/gTCnwW5/QDlK1kA8OXP\n/bLRKS30cgyGV0FYmAPK7Q3uWWjZ7rZOSz2WbTJMuq+bzzYI3mlfIbM4LRy2\nW0TqbCGx2SaHM8/FGRq95wVT7jRQCHyno1vvI2qWxPkKiNN5BRvUORFYx3wJ\nGY4q\r\n=/MzM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGQzie1CYoZhsrKKww5U/wqvRgqMEBvfw6hBZWpljktCAiEA3Bdz6TfQlmHYZE9+Bf9SyvEyq6ERcPiepkMLTkrmJzk="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.7.1_1585063523259_0.4984773028048559"},"_hasShrinkwrap":false},"6.7.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.7.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^16.0.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","iconv-lite":"^0.5.1","mkdirp":"^0.5.4","object-inspect":"^1.7.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.0.0-next.5"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"bf93c5719c88e4c7ace17d747c62844988a65018","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![Build Status][3]][4]\n[![dependency status][5]][6]\n[![dev dependency status][7]][8]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][11]][1]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[1]: https://npmjs.org/package/qs\n[2]: http://versionbadg.es/ljharb/qs.svg\n[3]: https://api.travis-ci.org/ljharb/qs.svg\n[4]: https://travis-ci.org/ljharb/qs\n[5]: https://david-dm.org/ljharb/qs.svg\n[6]: https://david-dm.org/ljharb/qs\n[7]: https://david-dm.org/ljharb/qs/dev-status.svg\n[8]: https://david-dm.org/ljharb/qs?type=dev\n[9]: https://ci.testling.com/ljharb/qs.png\n[10]: https://ci.testling.com/ljharb/qs\n[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: http://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: http://img.shields.io/npm/dm/qs.svg\n[downloads-url]: http://npm-stat.com/charts.html?package=qs\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.7.2","_nodeVersion":"13.11.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-pIxa8oGRlwdn9r+PfxMWAa27MPUvZV8+FU9m7VKkC9Ppe0Mi789ge1lDwqYiMFb3ZS7SBZMtII9dTs0UGqHvNA==","shasum":"3d55fb505cc82dbeb0f6125ddad0921639aa12ef","tarball":"https://registry.npmjs.org/qs/-/qs-6.7.2.tgz","fileCount":20,"unpackedSize":153474,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJee65DCRA9TVsSAnZWagAAowoP/01y9cbrRIq5qcpaz4F2\n2QbTK0gkTI1XdvoLBAv9nbrzlYJx5r8frVXWNNk9HlHst0ZjMewaWVYX094t\nz5Yga107k06Eo60eGnV1X6Wkp4C+Lcp1g1EOnIPjQnOiXUAfmAAV8zWoIoZy\nWqUYNd5ShIBT0FYxHd20k4SVTSF58ANVWBJHo/YqycSdZ5j1hrmkMYuukTAR\n98GbzEh3nbTrxCDDcoGASo2oMBht6NUwrBa5VXZTZb2qdr51zXpA5uHGZO70\nK96p6D+zTmpYLHJSJniBpIrr4c1nFLtDQk8xbBOYU9VITsY2aoW6TQi131cx\n/DcF56ygOmxvjwpUQ9E/DXL1r0OJOqpCHC1CliVg8UtqdoX8Uk9B2GyNiVBr\nG9JppBsTtda4DlfyHdt8ZN/0w6sT2VCyZKjKSaeQRjtAZjcQWdKicbEyhqhp\nLkEJgvJP8pqwCGnNOw0LmlX4xGHhnrE/9yY2DmUF2PE6QarUUI1+8riOIKVf\nagZW1aCBvA16FgitJ7EfAVn00ane3+h/1NH+CJ/j/ckhyCWlPtF0klQPVHFS\n9bUvVw/ZK4pUAqvhqDt7AiaOrqn9XQL29YdzH4XL21k4cXxtNJwBRtTfs7IL\n6z/AYuyrclvvs00Ggijn7ZIpdLmkeySGxWRciR+NvA8SPujNSEOksqh73lv8\nY7ml\r\n=FGRt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBhyMTGv8eId2eH8+9OoTAaz90/EVPX77sVjXyW7Op/6AiBoIss+jjCrv61B95tcsEYd4lxp7XmHtKG5Ig4foZuwSA=="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.7.2_1585163843069_0.512144729683921"},"_hasShrinkwrap":false},"6.8.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.8.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^16.0.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.1","iconv-lite":"^0.5.1","mkdirp":"^0.5.4","object-inspect":"^1.7.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.0.0-next.5"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"808b0b233e9408e0b5a7d7d19eb01093944240c5","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![Build Status][3]][4]\n[![dependency status][5]][6]\n[![dev dependency status][7]][8]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][11]][1]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[1]: https://npmjs.org/package/qs\n[2]: http://versionbadg.es/ljharb/qs.svg\n[3]: https://api.travis-ci.org/ljharb/qs.svg\n[4]: https://travis-ci.org/ljharb/qs\n[5]: https://david-dm.org/ljharb/qs.svg\n[6]: https://david-dm.org/ljharb/qs\n[7]: https://david-dm.org/ljharb/qs/dev-status.svg\n[8]: https://david-dm.org/ljharb/qs?type=dev\n[9]: https://ci.testling.com/ljharb/qs.png\n[10]: https://ci.testling.com/ljharb/qs\n[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: http://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: http://img.shields.io/npm/dm/qs.svg\n[downloads-url]: http://npm-stat.com/charts.html?package=qs\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.8.2","_nodeVersion":"13.11.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-WhVrQcdQbsjtovkTn8ODmBJrgxV98Rq1XUCPC6GRwGG4GUm+gc2d+e4ENoXBvNeei1u+vTS7VJ9wlA7nwQE85Q==","shasum":"c5453e62497c53a4b6b2817b4c724d882b74d7f5","tarball":"https://registry.npmjs.org/qs/-/qs-6.8.2.tgz","fileCount":20,"unpackedSize":155740,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJee7VNCRA9TVsSAnZWagAAOH8P/14qAzLqS2PLaRxf90uJ\njZjM3srImLrRAovsHjVjVLEIyMdbsBXmyjzAyOJoeHSS5VSUEx9+429tiS9/\n5uxPCCoAPl0rhsPQ1zRxLXJ/iONd8Uhnbd/rOUWQGjVKawiS9h6tAEmlgf7g\nmWjTud430q6cm1ticMEUPVhQvrh40fZz8CLrdRk7oAyxlWfQQ6ny3otEo9cH\nTEyCn7NoE3Zknie49oHRH4lfWVnU3jsBjwUVDEw6jDsj+G3FKEUWyfh4jWbr\nBQhvROrourN3h2NY56CcsU3xNqd4Me/K2jD1KYLxf7pdyrIM5qvz4l/7TwNv\n2Upjsj+IHPbt0DF+d0CwPfvkrK0BjlRjtzKfiHRkf5nhUvuaJlDjybMLmEAz\nJv5cUuAR0/lfUsdC+37iIZ5AW4NMJNMXgMbrv53JPy+YAoBQrVSk/u7WFwmf\nVulnt/EVqo47kRwzDopekPZoF8iL/tlSnOVsyJxR8mzrvYIwr4/RrJgnwqoW\nDbVQexWyJRVVbHSUTeSQlPrExbf7jGnzc27FwkUJlhInAD426XH0tU2S/MSo\nwqdVn56+a0T/NmeBkz2bFIlSD7m9PMjrVwOj85RTnfsAc8BSXo1n5MHwepCg\nh4tfPBcJdPvOTGNP7MS5USCBhpSbkrFRwbkd7Z9JO0GKA1TGbbZlLl/5s/BA\n9Gf2\r\n=cTie\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA9PMX7Uf8VS0AzDNvoCL6pLJn5qNh6vN2CXobI9WED2AiEAqtfgvSfMauFa2ah0QtqfOd1OBz3Z2V0aN27AIg7K6pw="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.8.2_1585165645200_0.5305560390651123"},"_hasShrinkwrap":false},"6.9.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^16.0.0","browserify":"^16.5.0","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.1","iconv-lite":"^0.5.1","mkdirp":"^0.5.4","object-inspect":"^1.7.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.0.0-next.5"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"511e1c9e527679ca182b055895ce301ea82213ee","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.3","_nodeVersion":"13.11.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==","shasum":"bfadcd296c2d549f1dffa560619132c977f5008e","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.3.tgz","fileCount":20,"unpackedSize":160076,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJee8CtCRA9TVsSAnZWagAAzgAP/j8WUxYBAFoHVbFRqK26\nMxv117JaEAH0GBBEdEgAtFKPdEVhLYzzTj+QBA4eZHqrB1uy9LdeIRzIhAr7\nVTReiBWHmQbs+kxRZuL5TBESsDfZzvF5XemV7O0kVar1DbsXM9IF4vW6+bCR\nLVXtJ9KehqkNO5aug05hC4jYZ3nSDNZpTNBYHIbHsKDNSqrsnlbChcI+3EwH\n9txs5lANhtXE5iHsnlWoVuY8A6cR885nIDimBdajLPFOTg1BnQDBF3gGEOeX\n/HYQLXy+2wSiR337mwlZw+W6Ru92uTFDg1HPgCN33/P1bpXg3l/sEWHh3MHa\n0Ngt2bDwt6pGHm716YV7p0aa8t82cTTyfFF1K4AcSeSOct0EOaj+kWMtSfqI\nacr6UFkl9gaPUal9MC+ZzU2961FUSeDkIHWLkDWHigEiM9l6y20lT302Cxj6\n4pE7qw9UKn6s1+BaBz045p1rOGgLnrNj5dIjlwpAWCzIw8q9q/hkauN7V9QN\n48gsVAWVCz8ml36L/KSuJJ6pVIjBDUywjelZKOCsmnUxS86qwtWy5QwzxAzM\nDQaZhxoJ53i2l37TexZOsVODlAdtj1lP9uEsbPVYcZXq29tzzDHr8nkHeWIq\n4KDsmmbSQaOTc1fWp2chvqRAC0mXgYrhWVVu4o7VwzDja+nvjIjR+h1mdnwS\nbzyM\r\n=edBT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEBHZwBrMXo3WpY23io46Q7LBtcS3G1DDAI97thHHnDmAiAwSOCt+AsGuL/esoQpWRNXbGMfr2u+gUj8arHCWmTimQ=="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.3_1585168556886_0.5838765005488886"},"_hasShrinkwrap":false},"6.9.4":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.4","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^16.0.0","browserify":"^16.5.1","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^6.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.1","iconv-lite":"^0.5.1","mkdirp":"^0.5.4","object-inspect":"^1.7.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.0.0"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"8e014a7b1749ccec52104121950e7b0d251caa78","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.4","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==","shasum":"9090b290d1f91728d3c22e54843ca44aea5ab687","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.4.tgz","fileCount":20,"unpackedSize":160179,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerz0zCRA9TVsSAnZWagAA+DkP/1nM5P1n2uJIBWozU5L3\nMGXafvAilkEQzB7WnXMkr/Kp+R/tow4LanUNf3why/IZoSfZrSb15tAXxBVO\niO/NWkAK7KWSsr3xYgDyjCwGtrRLJN9IIVrKdwIj4F6MWQSbhVP/ZoJgVBlE\nNXe4UOpYdla6mnEjwEW9yvTgV9461/ovogv7XSFWkG5wtf+debWZFUKnIjVk\n9JvP6ELLthwSd7lVWz/CiQ1i0wYcxARJEsxBXjtyfM+nWXBlfa0Kww3lKZUo\nqiITMou/759dIU1nev6z/VoVXu8KOtlje6BdWaroNbnOgKtNkLUCuftIjARJ\neuGz56IrCXegfeRbT1qMqk8GD/fgOcfojhsaOfH1yChw+Oo6KVCok6XLpJ/T\nw4SIntm0xcfHmwZNCd2NtH6edA2+Mso9qb3AmXkHTjpgWQR+zPypZzXExczs\ntkVzCL6205vPXkVnpT2FPjZ9kfV6kJxur1y3GPDEt2JDB0ChPeeBhzXT8ban\nGsesLmVhUEQ9baq0rBfh7X5GzNE5K7CT/1pMFb54El/+mc9GqIoBAWmq2rZJ\nMjbk0SU+KGBlaM1QzjVj94SY902byZ7VINNm50n3CwXqDsPJNLcfl8jSrNJW\nipGANtf+9m5YLhFLah7BdthCd5Qu2hoNyyl6c7AbQsTArmDvIO3wv/TZ1VzO\nfwuJ\r\n=y1jo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB9k/5UWnHhnSGv33Z/luE3wpaBizXqCb0v//OQZ+HN3AiEAgij5e+XjLsc58utzJK8+m8EdKr95EB4OQW0P2BBMbaQ="}]},"maintainers":[{"email":"eran@hammer.io","name":"hueniverse"},{"email":"ljharb@gmail.com","name":"ljharb"},{"email":"quitlahok@gmail.com","name":"nlf"}],"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.4_1588542770614_0.8554103980636278"},"_hasShrinkwrap":false},"6.9.5":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.5","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^17.3.0","aud":"^1.1.3","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^7.17.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.1","iconv-lite":"^0.5.1","mkdirp":"^0.5.5","nyc":"^10.3.2","object-inspect":"^1.9.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.1.1"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"179fafc920123e60466a1729f9f2b43b2fd67212","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.5","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-T0SnbxGiMcB09qd3bFcPt8rufxPs7T7TjePk33r1WsJNt12/rWsK/ofKqRHQ0rY/iMGE0mVdkc6Yg9CuL/ty0Q==","shasum":"45859f731392198fbd3f91ea4290e7c4e25232fa","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.5.tgz","fileCount":17,"unpackedSize":138396,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf/x//CRA9TVsSAnZWagAA7e0P/jUY6rNj3cJ/KbgFvcbu\nTWmaQdAtJWswMbLV/zmnbt6LKI0oNx/ufrsYJ1AaciXLX9oQFGQtMGsbxGLT\nzPQYNO21GAB71bVZTHvftTwJ903UbK+NhFdGHQ/X+CCwoUJoVoShCBhuJmcd\nOOl+C32qMl4H5Ffvc7pHpUkWPYxvNUR4gL3LcSTqCEZOu6m6ai2k1L1av9uO\nc1SsziRToLEzjxrWgUIkKc57KjBFXy07N9vw8xTtteBhHbO8aQVAqb+MqPB+\nGhPxL+el0JlmFcDk1pMJHGY7PAGbTTON+YA67Ede3j3Jgs31Dv18znkprPd+\nHiE849YoMvLw8LJVdmS9cbCNV60i4PUE4F1JHRCVuK2XhtoGHfnuH8NdTXwa\nHepEGhZZx8KlAA2ArmB86zlCdf98Hc8sCEQivR7CZ158+TSbLnbtr2tzurRy\nOpFuRWi31Gk5fXr84IzVK6epBKhhMaUnnjVubd2X/p6+45q183kKUG+2Y6Eo\nfaqeu+x00Fge4woETzNOMbIxo8LLfp5GwAykjLJSYV/s7TasIhMoaNMee/+d\nPcV01sMBtczeTmxxXyGe8QAuPmrPG6sMKlScbliqObVMxfFDHhxBZdWqYu7D\nPW3S+PXxMXxKuzPk9ecJ7k9SYLOzpAo2daZxqzGJpY34csR9MeZCjVGvCa8R\n9Zkw\r\n=3Rwm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGLEnIgVENqyFqsEO9JJc8Wbyoi4gY5ZWsPWNt3mlhorAiAxUpQDg39qa9J4+5V1ROkrQpDzBZLd9x1PD1+GdFPM/A=="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.5_1610555390233_0.7725320302686958"},"_hasShrinkwrap":false},"6.9.6":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.6","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"@ljharb/eslint-config":"^17.3.0","aud":"^1.1.3","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^7.17.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.1","iconv-lite":"^0.5.1","mkdirp":"^0.5.5","nyc":"^10.3.2","object-inspect":"^1.9.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.1.1"},"scripts":{"prepublish":"safe-publish-latest && npm run dist","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/*","lint":"eslint lib/*.js test/*.js","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"b522d2e9993a47afd810ed9a19d35aadb6323988","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.6","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==","shasum":"26ed3c8243a431b2924aca84cc90471f35d5a0ee","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.6.tgz","fileCount":18,"unpackedSize":164609,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf/85dCRA9TVsSAnZWagAAyw0QAJ6sJMP7p8ypPut03JtH\njh0RjokA1Gau10OUB7jmAb6aKd7YAsFWRrHuqr5Rj4iMj3mAd+bjeSOOn5+k\n9q6VxR/PkpDpPCabO1bKkGf4muLElJuKLdTNJ+1tRO46xDm9r8/JKeQlE1P3\nKQyVcP58Fj5OyLuyz9I+vWMF6mY1AwxYR97CZxry9S6dSPBATXD/ka50Veka\nnNw6FB9JGTLkjl1R7Iw4nql0gGpNqE4/ydRK36hluiWIj13x9VD3lJ49mdTr\n+xI3TI52ElMEG6Rh1NkfEwzf+lBOp4/INbu9vAEziaBtSFRw+XctTtXhWrYu\nSX9bJdr8MVewkuxerj3sTxWN/QMABNSdwXRGO8WrvDOh/hbuCIO42B2/4ogX\n7IMC/UOKwAJxQmodHWzRvdJvFXytQsuw+bowz7zVorfMyI0aXzbPOG8GxKx4\nZxTdIKzyLNSSRRZXw7vd/+xcByyd0PLD7ABxpuFPOJhqAzsHsyVca81vMNUb\n/COEO8PSXr+6MlrIer3lO8qYx5c8NBbwARKVRQcnI4uCWCNx/6Vm19sNWm4f\n2sXXpFHusTY/mDXmISVTv6eFoM5EVBH1mU2w/jhcra9YzJcuIZM95/BZ+brM\nysQ7OLdl1MtQTmfU1D8Mv9sfxbQ55h3hW6R/nXDiIeWsq8HYkYl0m3b/M07D\nsLBw\r\n=sS4C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBfx2o9FI3sGfiApjJR8cELYQp6mWqPr68zDczDdwLl6AiBT+G9vrClb2a/DHmlyEMVyXalFjlD6y9Wx0xp9HLt/RQ=="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.6_1610600028510_0.3565787797505109"},"_hasShrinkwrap":false},"6.10.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.10.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^17.5.1","aud":"^1.1.4","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^7.22.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.2","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","nyc":"^10.3.2","object-inspect":"^1.9.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.2.2"},"scripts":{"prepublish":"safe-publish-latest && (not-in-publish || npm run dist)","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/* !dist/*","lint":"eslint lib/*.js test/*.js","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"7c1fcc53047ed2d7555910fbce9f72eed1e450b1","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.10.0","_nodeVersion":"15.12.0","_npmVersion":"7.6.3","dist":{"integrity":"sha512-yjACOWijC6L/kmPZZAsVBNY2zfHSIbpdpL977quseu56/8BZ2LoF5axK2bGhbzhVKt7V9xgWTtpyLbxwIoER0Q==","shasum":"8b6519121ab291c316a3e4d49cecf6d13d8c7fe5","tarball":"https://registry.npmjs.org/qs/-/qs-6.10.0.tgz","fileCount":18,"unpackedSize":203463,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgU6xmCRA9TVsSAnZWagAAjCEP/05hpdpxqGnV5DIx1pUj\nd4BEnebzi8kJZ8qAVjpKIG4UFUguZ2bglT1x9VDTGe8qi0JLfz34qo6vcbWl\njrlN/jSIGQaxaLyygdceTyacMxG0vcBhNPWaRQiROtTZyuPCxSxhNSuSoTNh\npmWagOCFVIEPVBQ/33PfM6uQ7+BFfvHXzx4Xh9QfLL9g0lPWMpYIOWoy8KLg\nf8Dz1FIpBEqwFAd0zqAjikOQUbSBHmVAseNk+bDoCwQyLSmUwUZ5QGPjv6Wg\n4aCjTInBptLueWQpF2Q67JJH4iq7jeA1NCfcr2Uvzg0OtdN/GHM+IurPZ0YC\nOV5/mXtYgzVJVgLudY4TNVTDsOMIBt815r11mRtJKLlcB8zH+gtpQvSTWD7g\nmUtxVZip5nKdyxjo3vYGr6cUJ8FYDkdOr7La5XJRUf6HoIk2WN5Q4LqGbpln\n7M2Rj5VSl8l5UFvH43P8eJ9ia+3ItMJ1JFDhHKMaUczl5m2104kA7EajLyGQ\n/ONj8Gwz08J3jORNPhCELpXgkJbLqIJZiIXJuR0w2oyH5GbZ3XLI+4M/xlsa\nhGEWLkQxnII/NOEyGMW+z7sa2JbDrq122SDEVdpzrX73F9HBvD3SxVORjIm6\nvTGIWL5c/YkXOzmiLUfSDwXamEEQxYnBOv//Zf6zGTYdjuCUykTxfs/fBHU1\njzml\r\n=Pj3s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDmB9qfhtiSiWuheCQzshwy/XEcWgu6ZhaIyU9ORHd8CAiEAgWVt5woavZSM97ooJR6lWEKA/XnCcx6wrrFSjdX3dNk="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.10.0_1616096357773_0.0456838707513032"},"_hasShrinkwrap":false},"6.10.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.10.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^17.5.1","aud":"^1.1.4","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^7.22.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.2","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","nyc":"^10.3.2","object-inspect":"^1.9.0","qs-iconv":"^1.0.4","safe-publish-latest":"^1.1.4","safer-buffer":"^2.1.2","tape":"^5.2.2"},"scripts":{"prepublish":"safe-publish-latest && (not-in-publish || npm run dist)","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/* !dist/*","lint":"eslint lib/*.js test/*.js","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"dd0f954e4c00b02915f4cdc3ee5174ebc351f1c8","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.10.1","_nodeVersion":"15.12.0","_npmVersion":"7.6.3","dist":{"integrity":"sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==","shasum":"4931482fa8d647a5aab799c5271d2133b981fb6a","tarball":"https://registry.npmjs.org/qs/-/qs-6.10.1.tgz","fileCount":18,"unpackedSize":204351,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWBTRCRA9TVsSAnZWagAA/04P/RZzBn2y0QZ9x7McOryS\nAT/shkBUfw/3wEPfWUGwe+aPHAOuuy8Kx2iJ62wcsLv7irZyrgD7wbgqKrq+\nKDtB50n7sAE4liyxfaUB5ZErsmh3exaNaH6cmmdn01g4fOhFjxzwpNRcPhZM\n3xLcWMsCJGUCGyOAxOouK0pdQOFd8q6gn3gKKZD7RIe5UsDoxWFKpGe0LLc8\nCiS67IeYS6tBxG1H4X+FKGi7a+xzJVlWXubshkpOtonv+VvrtFUHntFmRz2l\noB1yaA/hETLunu3GQEjutvKe/IKPTKwsR+/CCBTtdzk+MuoRZkuvZSFdodeZ\nAWYBmV7vKviXOoNKx+egVOiSY53Se2FziwhP/E/rRmBR5b7CB3VLki6ZG9eM\nvzjbmEhgD7n/UOqDFp7s3nf0LopC5LuZ5xpLLqfgXQakJx9JF69B9Z8LHeAd\nkO692CcQDMtyYDTn7tfTLg/W1HNbNAIONmLnvWBnQSl1Xfp7jJ0sEeyanSEZ\nZM6zEAw/T//KlCZaf5PLcC4wh6fGxds6asUHMMwnNbX5fkU0AC+Ps3bUnG8/\n/2auc7aCtYn8iSKbv2VDpyPnTgMMqX04/HCBLCfYMa+jlN3qb2tA2rZhAyn7\ndScCADE1pzso0k5dfBz8W4ihzFGFFvuWUgk4uG9/Ib28/mVBv7onssVrgBlk\neL0m\r\n=9KJK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmpuw03VdpHMc05zFzaB/viqI7BxQ0QNRNI/KtUbxGCQIhAPwO1Fi/YenDnUEA1+XepKqokBPvlwaqK12+7LdRKLB4"}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.10.1_1616385232666_0.6098543358689268"},"_hasShrinkwrap":false},"6.10.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.10.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^20.0.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.4.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.2","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","nyc":"^10.3.2","object-inspect":"^1.11.0","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.3.2"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/* !dist/*","lint":"eslint .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"408ff95f1ab94ea73027bc8a7443afb62d41a72d","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.10.2","_nodeVersion":"17.2.0","_npmVersion":"8.1.4","dist":{"integrity":"sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==","shasum":"c1431bea37fc5b24c5bdbafa20f16bdf2a4b9ffe","tarball":"https://registry.npmjs.org/qs/-/qs-6.10.2.tgz","fileCount":18,"unpackedSize":212118,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhraPvCRA9TVsSAnZWagAA/7oP/1zvgp6eVXvRWWjswks6\n0whFBZNdD0W82Jvj+k8GVj61NCMNMCMC0jJN207Hsk0+Zubo+D08GYtkzQFp\nH/Z30hqHQT4y6B5UfLwuVn91nqA4VIGNa2BN6IyWBkWNcla7zdSMI1An84Sc\nJeL5oApcTYh/f9/DdYA1d6k7gnEzwfZ2osnvSa++NErDMvwA4VoN6DIyYBt/\nosAF374UN21TdC5FgYT5+oE/H5dNxh0Mlp9DBoveMKIzoFLvDjvcMJ0mRCP4\nmQXNlGhQyBKdS9lrwPyAIP3Ew5LSTuAYu26qU4bw+7xN2DPGRFvntPoTgcOi\njDrLdv1XQ9dfdfoCeZ6Q/bMttCRl89n45ig9YPF/bC9gPxpbGQ45EYutmenN\niF02bt5iK/tEGmaTHz7TKFOXYg2+EOJ37nWhGtX71tNbJjbeUw2P852HoIA3\nmAZfoQjVKB6zWMMMDC19nbW6Rfuhmoqzdw6Lnq0noKpNLOPQuZR2zq/kID/b\n2R4NmopNbNMxyZSJfmmZAGeusCrHZR4qqJPqTgS0+/a+PZoXTRT1hJ5RQWvt\nlyobSMhcTWRzfWqDryhOaUk2COaTkQaNOKu6xzxNUrDDwKh/fH3J9iLJrbHL\nLXhI6TBxMiP7C8uy91CW1tezV831vqaLF4/pxTQm/zwtXtmTLBgfy9JqHAhW\nrqmj\r\n=crlK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDpEHdo3FU5Y36wrt6VeeIzO2pYhB5uWMDFBe4m7/ajIAiEAn7HsiCAlCU75a6VrPj0H9YJ/hcIX5S17fcr80Q7zSMg="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.10.2_1638769647471_0.34729957789095955"},"_hasShrinkwrap":false},"6.2.4":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.2.4","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.17","iconv-lite":"^0.4.24","in-publish":"^2.0.1","mkdirp":"^0.5.1","nyc":"^10.3.2","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"90d9f2b45715b7b03da92113a7b8af236c01088d","readme":"# qs\n\nA querystring parsing and stringifying library with some added security.\n\n[![Build Status](https://api.travis-ci.org/ljharb/qs.svg)](http://travis-ci.org/ljharb/qs)\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a plain object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar plainObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(plainObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`. If you\nwish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.2.4","_nodeVersion":"17.3.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-E57gmgKXqDda+qWTkUJgIwgJICK7zgMfqZZopTRKZ6mY9gzLlmJN9EpXNnDrTxXFlOM/a+I28kJkF/60rqgnYw==","shasum":"d90821bb8537cecc140e6c34f54ec76e54b39b22","tarball":"https://registry.npmjs.org/qs/-/qs-6.2.4.tgz","fileCount":20,"unpackedSize":97073,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3RxPCRA9TVsSAnZWagAAUIIQAJjd/IK3YAoEqgl6z6Rs\nAwy+LT9VADqNYJec0AYGLDcU3pR+Zl3BMipu75g52B7IiRR2cFi5+qNYNyf2\nBeTjarY6upKTV0np4ESUl59MTPzIglQ0LuGTTX06Bd22eZaiWgR8BCRsJ0Ue\n7xKV2XJehi997HIu8Be9swLiAS8FtXSqjWPQy+99w9j3hksaVVnDtymDNxr7\no2r9y3mYIrsoUlOviiNr1KiNLdZf4btlhD/0Q27R04BQYkVa4Es+qYKlhz6E\nVuH31lMTYoki5D68gtb/bqL//g8Fnws1/W5DkuAswJTzDyhLlA5tPs1HL/mZ\nvQiufH0qSf+84WB5G8xzQBQ0Dm0rTEsg9JjRVgJJtAc3okQNJiBABfbCXWbQ\nO2qtVk8S8JDpflyoMKx34hD/kMKQP/bl/bGJPcQK0mzXIRTYiNyuiKd0i3BK\nTEyTJqPgxZPNFPrqlUPm2aMYWmbSXbo1F0P2WdOvff9MGbMlo0hMr0sOpUqI\nfodfikw3/xNb5E6KHdJkaM+uqyFsY30vBMZrkPQoZoCxh5nW/WguD4J8Ib9K\n7xGoICNPRQAcVcqrBrpW4k6okwh4rbc2vGeefHjauGkBrlnZ2efO/tSx4ddU\njOuxr4mM0y+1J/6/TZx6I4I/uNpcJWS5cwWw2Wj990WLaNedQCx7vy0Cd5d5\ndTP7\r\n=mtgI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClXncLF64oTkJulkkcw9bDc06J9xV3mEpBRa7XVYYgBQIhAKneByXOPfrgLAsKHUvWfhSVQWEejq/ajlWk8ot7CPvH"}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.2.4_1641880655055_0.18330013316566696"},"_hasShrinkwrap":false},"6.3.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.3.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.17","iconv-lite":"^0.4.24","in-publish":"^2.0.1","mkdirp":"^0.5.1","nyc":"^10.3.2","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"ff235b4ca81f82728b745b71fbd4bad173535305","readme":"# qs\n\nA querystring parsing and stringifying library with some added security.\n\n[![Build Status](https://api.travis-ci.org/ljharb/qs.svg)](http://travis-ci.org/ljharb/qs)\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`. If you\nwish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.3.3","_nodeVersion":"17.3.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-f8CQ/sKJBr9vfNJBdGiPzTSPUufuWyvOFkCYJKN9voqPWuBuhdlSZM78dOHKigtZ0BwuktYGrRFW2DXXc/f2Fg==","shasum":"645c23bd6def4d552f258f0aadfeea6fd57f5a86","tarball":"https://registry.npmjs.org/qs/-/qs-6.3.3.tgz","fileCount":20,"unpackedSize":111131,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3Ry0CRA9TVsSAnZWagAA6h0QAIlK+AZk+Rru+Mpu7SkD\nzfguZ53h5eKnQBdiZn9xhsc61TI2XvT2/v5TGaHNo+qdhY8nomTcMoSkvlpv\nxASo+twbC0V8s6jFEHdu6vhbzJJyRmGzfLYAS30CUUFQabTk9M363wFcpI8x\n0OeSsz+Ci7BvBsynFtgOKcLRTcg3+rx9oa0gHxHxbPccQv0nLPOqqe0GhRxw\n0qbbBVxSc65be4KHkKQBE6e9HTcfJMr+s/TIn+4IkR+stbPLP7l3bqqnZw3t\ncuMksS5TjiY53a+dm7FuJeb4Npu8JEfGORr4J5Qbl6bU7goHaok53MA7hZZo\nJt6QR55xhX5c7OaFFPGMiikpU9eIH4EU9zCPO0+8igC+sC1+WnpcFdTz8+qA\n2hsjma2+OVppgmFJuctMzTPa1lkjltOvb0pUFFnnKPtHyHkQzjl+BNAmTUL8\nx0GbVH7AkBlsFWvYngtXcOqjrg6SrylDb5ODjZMtd+zBCUMN0sFJMGu7ORJR\nodo3NCxrHfnnCJviDcV0gPTAaBYFH7+5SbeJ3OER4lCFGqNWHYlLo7V1I/bO\nkMFMQjjn7K0sq9vLTvReMMcM4Gfj8kgbT6yIkDAxef7i82xEqndyRJ3j00vh\nOYytST8vY34KrFl0Khwr7IVyD/Jv7O7I6m76p8s0Dyp+GoRSGtOqMjjmPLwE\n0Xyp\r\n=xNym\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBPhllB5s1fKRTa6yAxUv9sVMs7gCOdGUKizxQkLA2EyAiEAnOYqvUv5hG37xM4nE9n5RlRe20B+ZJDXhEKqdBkJht4="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.3.3_1641880756518_0.8930809421780708"},"_hasShrinkwrap":false},"6.4.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.4.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.17","iconv-lite":"^0.4.24","in-publish":"^2.0.1","mkdirp":"^0.5.1","nyc":"^10.3.2","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"486aa46547b4e878d6e87183de95dd26d46fb020","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\n[![Build Status](https://api.travis-ci.org/ljharb/qs.svg)](http://travis-ci.org/ljharb/qs)\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n)\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`. If you\nwish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.4.1","_nodeVersion":"17.3.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==","shasum":"2bad97710a5b661c366b378b1e3a44a592ff45e6","tarball":"https://registry.npmjs.org/qs/-/qs-6.4.1.tgz","fileCount":20,"unpackedSize":115464,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3Ry6CRA9TVsSAnZWagAAU/0P/j3r+fhcBRg5tSM9UBbK\nkVRT4rSQZOMtA8Hk3hMctvSl0gEzcVh93AYi2tBuMUSe0NUa/lpS8V++ycxq\naDSL22UiCjMmWZKc1SQUuusNmDw2Tw3VDZ6feNmPPcy6H/Lb7xtnC5EfzR++\n2435TIbYN+z9ffa3pAWVWY4p7Vlnw7YYXjAQH1OZdjr/XqnH/LVNoNH/i+1r\nAumvJXflTDqOFYte8lzYdVtdQkcf+HTH7mjysl0NqNWVAZLkweAFuarJXaz5\nImtGs2F2G9jkOJyhjWjM0RAnH9EtgBkaGzkppjim5uu4utRrCDq9IiDxLTcU\nK2KX6u2hStvnsXxQJWartr2X5gFSea6WXylI11ivy9naS4eHzaBFM9Jr9ZVX\nAt6+Zv4lQlj9AcSHcfj3p69E61D51zfLpW2jZ62sqouWbkir1lLWUvhhQ7zB\njjZXmQOyaJ18gBY4e/3O2CDirAb+FuH8NiV7Vf+zdjN0RYUxFl2k9IwOcKmQ\n8FOfn6bR1L6cflfkjR5ksr9b78uNsqENK6bPH+1NSMmDnhAFV2GFHMy9CdcX\n9QH5zALVkOkRoCEciwnI/i6kVFOG0GDY+OBD8PDZlRzfRQ7G37mdH21CV/KF\nwgt/3lCJ+jSNhToDVi9cBMVgEDVsmHmQtyfukW7kpPlfsK4Ox4ty+Gt/Tu0+\nJra2\r\n=tZ+B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID+U9mxTM8fYSXvAP0LC1gYkdYl9KmqqyojHBoqVDjBuAiEAvPFMEQbL9Rx/7GaLU7wS+iEoQYUh5A320PUjsN/cCIU="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.4.1_1641880761698_0.30524380188952716"},"_hasShrinkwrap":false},"6.5.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.5.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.17","iconv-lite":"^0.4.24","in-publish":"^2.0.1","mkdirp":"^0.5.1","nyc":"^10.3.2","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"298bfa55d6db00ddea78dd0333509aadf9bb3077","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`. If you\nwish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.5.3","_nodeVersion":"17.3.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==","shasum":"3aeeffc91967ef6e35c0e488ef46fb296ab76aad","tarball":"https://registry.npmjs.org/qs/-/qs-6.5.3.tgz","fileCount":20,"unpackedSize":125650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3Ry/CRA9TVsSAnZWagAARJAP/31C2jFC0u7IMUBuJzEH\nVgP2pjpcyXVVyTfls7Ti+0M3EIhXfmtAbHfiqO6RZhfYHtsiEwd6TzHsCsAM\n2S4+Egi1bTTque41/LzcEjcH3RnXBgMqpO3qk5mzXBojEHTaQZtji0uykkA4\nq4y1CDb3WXbZXL642wBjEqUb6GSNf39rXq/0X3NaSr90YcTrnwys2etaSIvp\nevOZZCF0I/O5o9iRnim1X7IRifnQLY89XAXUHANnXvaiasugXivYyUw3P3Tq\nvMI38pbB5051SM3gGlTvifjJk6OrvgAac3XKmpxYopXHn4HD5iCMVOjBBr9v\nVUBgg2jdt9jVLNIz6oZpVFBiA2xcev1hKfCi2yL7OKIXiF8UlMHDwBD9m/zG\nQUEJy78/TYVL1PyVtf+7m/6N4v+JL8wrB9RWL5ZojC5lT8s0EhalXOL40G3j\nvV0pjzdnBzXQqzp8dS6WclknP2yS2viFhOFdQzE9PmcePa8HegKY1ZvBXbtL\nLvxj8QJww5xaGVtm3LHn8RmzJJmDi6oQp0RFeRhKD94FUWu5X3oTYFCGd9Yc\nKJ0J0Nx82not+Z2lnWjOpx2FVilLBsWj4I6kuKWK0l/14FdliyBXu2iUtgEv\nbmBm5ToTq+yjrcHvZ3sm68DB1vV/rBe1//AIagjXAJIdz3QlbJNw8NdK0ZOm\niyvD\r\n=Jprg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/+fcCTyLPsPv3vmLlT2r7meeKBHQ+EMnyZaSuz4nUjgIgFkzvYa4xVIwZ5VRAvqHLVHcN2QUIXSOX2cc7IwZW4pw="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.5.3_1641880767360_0.6826765969830277"},"_hasShrinkwrap":false},"6.6.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.6.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.17","for-each":"^0.3.3","iconv-lite":"^0.4.24","in-publish":"^2.0.1","mkdirp":"^0.5.1","nyc":"^10.3.2","object-inspect":"^1.12.0","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^4.14.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"4cc653c08c583c0b39e2eea0bf1cd2226ac5ec51","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.6.1","_nodeVersion":"17.3.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-DxHK46yYwC06eXWu3FCqlADDkzHZUhkaMY2o4jFbPtN90TO/Y4jzyuOpCa1iZ4OvFEOCC4MoGzubQUdxpZzk2w==","shasum":"badc3705933629bed17bc709ba824ba0676708c5","tarball":"https://registry.npmjs.org/qs/-/qs-6.6.1.tgz","fileCount":18,"unpackedSize":146433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3RzGCRA9TVsSAnZWagAA9nMP/ij57bkypPa00qAx8osB\nj5PT8eTJzcX3Gqs0DmJ5Ur6Wm6AMqlQWeEt9We76CpwqWf1Oj3liEKxip2vb\neupBl7p5K82sGZo6pn9OH0AtRrOdejUnG+Kh3uYRI2ssaE8DonT0F9rAxGnV\nNf3qCUqIhX8rxWBGZeeXUqAXwPTqejtU/Q8xcPKWpDQ+MqFbNsdVVJ5nIMRg\n8Lxts2UVqOyynpkim3nYgGWv4bA7CE9tA4MqnN4uFftd4ScLARedZ9+2HgVk\nS/Gj33rrs5ipg89kEPYK99LtiUN/ZEDru2i774JDiqDabzMRV6Qn3+NPlCt4\nssdXlmlvRmvZxdeSr20iGSk9rE7zNYjhTRoRNylCZZdc3wtKTqcIJbUZLJvd\nu0KXEKjrTjLMBUc7LtKnInx8+iK52j2vBOur1sLcOdQhmOn6gq5FJWk+hdmx\nJI2llLz9E/DqX69xhTj1/awQsVQu3BtidKFS8uvzMKWMpflpjZix/43Zuxx7\nfZfjHmOceAzRRrt4qcymirb7oHlA6rQdC/+FY1JW1KI/1J/rVpJ/SQUvHP/4\nszxLpogeszMeQUo+0RfUIrhgahDsZ0BSDOloUDc0kHz2qwX8P+9kZ0MtiYm9\nrLyICxUuKre/y9BhEf+4aTvbPcsgZkIYO6fbI0ZCDIy411pgMdrPvcldPqem\nC5D/\r\n=3jAG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYtey4BsM/A1UTqrfo1wDbFgoXicVn09oJuLwlWpOQUwIgd7PRtFY2SVYEASWEc1B0tAJ9XgyL9co6gPozhH26kko="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.6.1_1641880773898_0.27251653471782267"},"_hasShrinkwrap":false},"6.7.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.7.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.2","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.4","nyc":"^10.3.2","object-inspect":"^1.12.0","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')","lint":"eslint lib/*.js test/*.js","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"834389afb51ac8cc03a22a0c76604c65776dc468","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Parsing primitive/scalar values (numbers, booleans, null, etc)\n\nBy default, all values are parsed as strings. This behavior will not change and is explained in [issue #91](https://github.com/ljharb/qs/issues/91).\n\n```javascript\nvar primitiveValues = qs.parse('a=15&b=true&c=null');\nassert.deepEqual(primitiveValues, { a: '15', b: 'true', c: 'null' });\n```\n\nIf you wish to auto-convert values which look like numbers, booleans, and other values into their primitive counterparts, you can use the [query-types Express JS middleware](https://github.com/xpepermint/query-types) which will auto-convert all request query parameters.\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.7.3","_nodeVersion":"17.3.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-WBoQWf5L/UOLqUj8Mvr4Om7J+ZTCqPbYPHyeLNRS9t9Q3M3/o/9ctpWnlo8yyETPclx7FhH5LidjKKJa9kdSRQ==","shasum":"67634d715101aa950601f58dbef353b7e1696b95","tarball":"https://registry.npmjs.org/qs/-/qs-6.7.3.tgz","fileCount":18,"unpackedSize":159376,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3RzLCRA9TVsSAnZWagAAIs0P/AvzIXL2ATDnw6dflk7q\natAKMqPu+csP2WLnHKAAZ4zJ7fQKTlO0c984d/0UI6U6qPGtn6ke5LS3zYzz\n6ttkfR9xRMqNjWBjY+bIzUpC1TkvknBnGPw7kvIiAnXsB+oycWLRyudoHNl+\nj9VYCIIJkyzes+VQ6lMG9JyPoGXBwit5kUS/wE1RRgGfQvGJVpCtMCju+X4I\n/pIXdvSqy3FiiG80blFDTSfMdZumv3UgwCCINTBO0WyGJwDDh9I/W+xJi0wk\nEFzSCujmA2x+7m2iRqsEermfERejBgvZkM6Na5YYrVEQzQjGpllVX0Z8fSqG\n9fNv5FrkM7qSe5K5L21dSVHsJCM2i4Fs1IdyVuKoz/HLQz9iK2MS6ZZBRC9a\n7d5ubp/QeK7nGJfZOfAoiwa6B6k/qre8Nd56Ioo6EmSFCqZnPAl/RnxcMbyx\nC3MJS3TaXC1QLOAsxjyUWsUKGwrsyJtsJH71P4NtLbL9hgmpAxTb+RmXiLzL\n8p8DObIS+3LE+YFh4dzmUCPA1HY8an5sxnwetETn5PwQkcXRp8MEMKAt2UnO\nfBKojoJiBpgWR2U5sKGtMdOgwr4H64Id1cBTw9vMq0c+68P361FBH229JQWf\nhYj6WGpOQtCqGNe8lSpyDroxbBM8gFiY3eDZdx3NcDWk7oNZGRuF61gacL3K\nxMCt\r\n=RX3L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIChmbYieZAGjScHauRxx90t+ky+AJxifseQ4LdD9sY/oAiEA8U4XwUKj5x1FesWgUW/bdb4eLywetBn+KEEL1y+DsNs="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.7.3_1641880779048_0.3030605328691325"},"_hasShrinkwrap":false},"6.8.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.8.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","browserify":"^16.5.2","covert":"^1.1.1","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.2","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.4","object-inspect":"^1.12.0","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run --silent coverage","tests-only":"node test","posttest":"npx aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/* !dist/* '!coverage/**' '.nyc_output/**'","lint":"eslint .","coverage":"covert test","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","gitHead":"0db55386013a5d92503944ad42022fd8c112c983","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Parsing primitive/scalar values (numbers, booleans, null, etc)\n\nBy default, all values are parsed as strings. This behavior will not change and is explained in [issue #91](https://github.com/ljharb/qs/issues/91).\n\n```javascript\nvar primitiveValues = qs.parse('a=15&b=true&c=null');\nassert.deepEqual(primitiveValues, { a: '15', b: 'true', c: 'null' });\n```\n\nIf you wish to auto-convert values which look like numbers, booleans, and other values into their primitive counterparts, you can use the [query-types Express JS middleware](https://github.com/xpepermint/query-types) which will auto-convert all request query parameters.\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.8.3","_nodeVersion":"17.3.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-lvnoy9TgoYNQLYY6Ba4ptroTR9ptMkMQuXLxH4oppEQtglfAop+ZaC0dtAgY75rarH73CPu1eq3XrtzI/zZYmA==","shasum":"c1909067d1f6c2f62f9bde1c44b44c72d2fc7a41","tarball":"https://registry.npmjs.org/qs/-/qs-6.8.3.tgz","fileCount":18,"unpackedSize":160581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3RzSCRA9TVsSAnZWagAAVkQP/3+yjAPuHkno/KvvPCRb\n27hlzu4XS21a/Qttu9YHRLGlRTfBwkRmikrohZGoY4j9O8F9ZwS4vzjuiEld\nJCPC2omQTe1Wg6tQvIuNIRDfuGvXCJqYrQVBEQUQfy8gKiSkm1Lm4Z9M/GoK\nd9WSH0ZRuUIA/HZffK6djgQ2VHzBm72GsNHnwPjdJM0cNVjSglzdFDxirtJH\n3jEIuDStj1SVQ9Fa7NsL2nScD6tzloy5Md9FQVNiD4M8Ij93J3JNPpYOiG6h\nFZ4GIHzUTk8yB41+KQ9n5kYM5SsTMHp4+nWxzgZZBCmXb8sDVdz3+3LGDkHo\nkaWXlKqxxEP8kGY1DJ5jXfI3rllED273u8P5NN3x0L98EWKdNu8KvpdepSDg\n75YxHpLeFLOjIFfSKXOJkDBv+iM2QBbj93B6ccr5mfC+HtfQOa99R+HdYx2Q\n2GXbYi3SJHcxT6N5fcuS/j4yiWsTWsKo8AO9LPjzmithO7Chz9ir75v8AtZd\nnM9aVLRK+qxd2VSUORh5CSlgV44OEUEJX4ofUxQHX7LHbcxKxOdlx5rJlMEs\nUYmx8NR4A/OHvzv6xdgy27w2mhU/7H2xzfNEYKXnLR/+Xn2YrtwyxZAVZwn0\nvaGUT1TDwErpJbyl10JVONgy0IEOiDR6oOlabGekEtlErdyWQusEnHM4Je8U\nrwNP\r\n=VbFx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID86Lv2J4W9F7/nxZM1lhE0yZRqrRDNOF606cy3T4MVLAiEAmcns3SCV9H3FFXyDFQnR7YrBz/tuIN8mVVPAmQurHpo="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.8.3_1641880786115_0.8679919915915015"},"_hasShrinkwrap":false},"6.9.7":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.9.7","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.2","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","nyc":"^10.3.2","object-inspect":"^1.12.0","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/* !dist/*","lint":"eslint .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"4cd003291fe3b347884f797e548b58a12150a0e3","readme":"# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nIf you have to deal with legacy browsers or services, there's\nalso support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old\nInternet Explorer versions are more likely to submit the form as\nutf-8. Additionally, the server can check the value against wrong\nencodings of the checkmark character and detect that a query string\nor `application/x-www-form-urlencoded` body was *not* sent as\nutf-8, eg. if the form had an `accept-charset` parameter or the\ncontaining page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the\nreturned object. It will be used to switch to `iso-8859-1`/`utf-8`\nmode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the\n`charsetSentinel` option, the `charset` will be overridden when\nthe request contains a `utf8` parameter from which the actual\ncharset can be deduced. In that sense the `charset` will behave\nas the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character,\nyou can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel`\nmode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Parsing primitive/scalar values (numbers, booleans, null, etc)\n\nBy default, all values are parsed as strings. This behavior will not change and is explained in [issue #91](https://github.com/ljharb/qs/issues/91).\n\n```javascript\nvar primitiveValues = qs.parse('a=15&b=true&c=null');\nassert.deepEqual(primitiveValues, { a: '15', b: 'true', c: 'null' });\n```\n\nIf you wish to auto-convert values which look like numbers, booleans, and other values into their primitive counterparts, you can use the [query-types Express JS middleware](https://github.com/xpepermint/query-types) which will auto-convert all request query parameters.\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1`\nusing the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric\nentities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by\nincluding an `utf8=✓` parameter with the proper encoding if the checkmark,\nsimilar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`,\nand `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.9.7","_nodeVersion":"17.3.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==","shasum":"4610846871485e1e048f44ae3b94033f0e675afe","tarball":"https://registry.npmjs.org/qs/-/qs-6.9.7.tgz","fileCount":17,"unpackedSize":169869,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3RzXCRA9TVsSAnZWagAAuMEP/3OtllpIwsYdO9cWR5rz\nxYR0HxYCaFyAFOMm04YUBnxpCQr473snA66qPj77ryfLNlG2/G3EC/HOynda\nVJZFGId3mlzVTMF9vY/dC0iLl/9NhD57gVK9tKcOXf09/Rpn+piR6ZQFNen4\nM1I4+ZxfjkvO8p4P74LNJ13rKvSj0bX8fVyStrmxGceEu8DhZduu0Y9S59KZ\nwQCKFwE8UueQDZP7I+fDv0HHu+i4jUeTqEgcRAK032ivj0jUJVeTjmafKmTa\n4LBChXZ5CEpeXzqw5H7uNwKZlkBjXwfuANJ5iVbIuLh73aOuLVvUzoNCSme+\n/+aiOuELjK0PKAKHo523h7p6K5CWfnTKTeMUuZnCZ/cmRnRVoRiv5qZPaz6x\nH6sMkO9J6Ofl+aE6YyB6hySv+e+VflrD/K1poLcrvlRwnkOZYC1cg5z7TmzW\nO5NTiAfsbjf0IUYol2EaQsnx6G1iuaaNU2GVZ0rFDTyMrFAT5CXy8jKsUjyS\nkbzZjtAk6TqTHcDSOV9Sgfqc20W1b74XssjWgN+YoL5iB3s7J5TfwNNM7X8c\n8/w5f4enGJ6RrtT4ZIQBgI1cio+q4VJR/UUFr7g059HKt/32Qv+ZVWVatjHL\nVOv9SDjGebCxI4z3gVSizuRhQZOzi/LwUFSZlmHyZM0Q2bspRuK7o1OXNfDj\nHdW8\r\n=XdBe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGvJUd+HOekbaDUZCtLznV2MBA58mNtzBY6W2c1vSJPMAiEAiKceZtJ/ec00WXH/exwHHNRb16vnRNA5DGMjD5SMIvY="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.9.7_1641880791666_0.026589856843736603"},"_hasShrinkwrap":false},"6.10.3":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.10.3","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^20.1.0","aud":"^1.1.5","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"^8.6.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.2","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","nyc":"^10.3.2","object-inspect":"^1.12.0","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.4.0"},"scripts":{"prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check * lib/* test/* !dist/*","lint":"eslint .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","greenkeeper":{"ignore":["iconv-lite","mkdirp"]},"gitHead":"f92ddb56089ae2c74f5ca7b0447fef3a97e8c9bc","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.10.3","_nodeVersion":"17.3.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==","shasum":"d6cde1b2ffca87b5aa57889816c5f81535e22e8e","tarball":"https://registry.npmjs.org/qs/-/qs-6.10.3.tgz","fileCount":17,"unpackedSize":216400,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3Rz1CRA9TVsSAnZWagAA4RsP/A0gqkTNbA91pFmvx7DH\nhj+S6QXRMPzssJKVQGNwe8aiO6GlYo+hC7lKMEGVC9X8208+aeyMNgLU5+nK\n5a8jo1w5DAHv7M8R/tzkAEBcVDMji0MAGgjT+W0pUISeieZiQCAwvEbtLsJl\nFeVZ9+Abwt8q5J0vXiKLPTWBX0gYDgGLu6U++t46qdeGBh2VojmlD4VuN0a4\nYA3G4/awY6LOMng//lT7GW8Lc9Vg0dcuTk4nmvqC5BXg4eBfiVsOhgkmjEnl\n1O/V66p3qCK/HfR3mWKewIbulrC1lCEwo6c8jCaGU5YFIbVnljCGJ9SgNwB0\nvQAuoDyZ07rsv+TJ0Dk23T1TL4OgUPzlZqKYjFhlFk/wV3g+nZ5AYxLpEEV5\nO8138WRWsBnOAeECl1E/eOcgXGtNB9t1jphYfjHLVjscHwykwT7DCKRPvEBU\ndeaie1OOXWSInXcyIqZ51+cvNhBYGa381XLA6JuPBxJnBx19WZfmc63E5vzg\nYFpbOv9Hr0m1TpnKeB/mgP+vQO1A/L7yCiI0l2Yv8aizSwE2tZ7lMLEi/J1P\nguB98I0FM6D5eGU4gF/wv7ipar1yvofvQBjSElCyzNcsgeOukPDSZvA8eFN+\n2InSMy5ENl65cfbiPuQhYjbJqi9frYdlUS1e4Apnxy42Ym2qUMiHKZlLN6qt\nU4DI\r\n=APG3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPJ46DoXU1ydWyqKNmM1/Kl3DuvkdrtVNcgCcmnl3IOAIhAI3nrlggSaolvdZMmy0gmyuvGHtDPrInq4atOiCjCKAk"}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.10.3_1641880821514_0.1327648895755973"},"_hasShrinkwrap":false},"6.10.4":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.10.4","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^21.0.0","aud":"^2.0.0","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.3","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","npmignore":"^0.3.0","nyc":"^10.3.2","object-inspect":"^1.12.2","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.5.3"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated","prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","publishConfig":{"ignore":["!dist/*","bower.json","component.json",".github/workflows"]},"gitHead":"ba9703c0340dfdeb73cb4387d6ab32c37768aa5b","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.10.4","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==","shasum":"6a3003755add91c0ec9eacdc5f878b034e73f9e7","tarball":"https://registry.npmjs.org/qs/-/qs-6.10.4.tgz","fileCount":17,"unpackedSize":226413,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEg5HljnV54vYV29J3iO91OriMUBODe+7K3Wgh+CfErQIhAOwTA7sV8j0vtmPzKsGUNFevQzZGb7II8iostxyRiMtD"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinlBdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7qxAAgCkWc9sy8IUn33bSi/57HsGgXBrvbymlYuDGieLqsZdXx+cL\r\nbvYC3Iwvm5oWF4QZdAQQ1Z1ELnLJpFGJ4Aai3QgEiwWO2YMHH0PO9XDbl8O9\r\nrEbNJaReLIr/5FsChDJut6pZQ17KgaLvvI/aiTKeq467dtcMSR53oUVwAV6i\r\nNhilsui6zwaWADSfc29MPZyaJYPTZ7S4v1Zw54SU8JyOoF5JmTb8IKJM8iid\r\n3UXTJjxHd1FsndmNsmoDq1Kv4sAx9K0hVxlEw9SKhB1b1x9xQtdjQJl6uqcd\r\no7+o6t5xCgAKd+HS580D3t5VdKYjMMVL7FVFDmxPluZP4T3H6AFA9MrlvFUv\r\nN49988+MsyIJch8ZOwgDOQrLjysNj8vUrQfnGgOmi6qOYR3FJwX7U/57O7lq\r\nXGGN4gyNetxGTvo5Em9Pbv5ND1OpoSRJi0qkyToiOrleJCja8/Q/OkjXguci\r\nl6znO79LRlOSH/i3T6viwCoeF8J5Os5nLlC1dwwMuIpfoc55wwqKUeCkywYo\r\nDacRzcyTEsbP+CQ6Yiu8J39+tQQx9jvuR7B9dX80OMlSsFeXYWoCqDYhbgmK\r\nvebdMUDJuCkazL0MSeN6DVk4CM50EksfsEX4M/lAkZGg/pQ3YfZRqbyHTw+T\r\nJxbKuDSH72iPauvupPFe/H5Hr/ldeKqqZiE=\r\n=j3Jf\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.10.4_1654542429609_0.7992067402346508"},"_hasShrinkwrap":false},"6.10.5":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.10.5","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^21.0.0","aud":"^2.0.0","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.3","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","npmignore":"^0.3.0","nyc":"^10.3.2","object-inspect":"^1.12.2","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.5.3"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated","prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","publishConfig":{"ignore":["!dist/*","bower.json","component.json",".github/workflows"]},"gitHead":"95bc0185e157d400da4f43f1fcf1c7f008fd847e","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.10.5","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==","shasum":"974715920a80ff6a262264acd2c7e6c2a53282b4","tarball":"https://registry.npmjs.org/qs/-/qs-6.10.5.tgz","fileCount":17,"unpackedSize":227634,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEIzy3DakoZdSFeM2LfwsGuVTVgJo/Xli3gZN4p8N6+MAiEAn/Z2hFPrrgTLjXE2Aq+paG5nbV+jRs/JTMGd5VQjHF0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinoUiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrsQw/9FB42odBdnnA49SAVJlysY3Wb2BtL7BtN7NxeVW+7Vuh+Ra1d\r\ndJgHqAKXBc6QW8il0gu9oQ7udoog18ghshoLfR4w68TNj44WTFmNTDc8zwsJ\r\nHNiPAZHZXntGPFKKDf5w7aPQeUa8zfu+k0zFzWBQAfzUdzFRCumgY3uIHyVd\r\n8o8ZqsROappuv7FHxh4YYqEIdj1eMQSi7mhqm+5/1/ElqeGTIH8eP9aqism6\r\nPD3QvzYZYZxohcj+8rb3nshQH6zNePyHndEwmM2Q0L5HRkusWiQfFwXmVv+Y\r\nplFvpuo6rgTaLNPrdRvr2rF5fT8WZN21Q4mwoEXiRKHTbGuNyiKGagkk2m62\r\nuLtJwvDQFhOZMzimUMZUMJKGWq+DZ8/Z32I5P58VKOvu2ccKY6n761aRz4vX\r\nmtrlCO3MllrmQcnAx9wOCgvHhyzyjj4N9atlTKeCbieFkOYIMRed+BDW4xiZ\r\n+iN7dYfRg+Ep0hrzizkI6zCkxp+LuhczSvV3YDx3iNlgYxURq8TGk9yOFT05\r\nS40rVwmVSP4s2cME/liqjF94x8dVROGTDP3OnXiaq/MmIDSqjqXvm6SM8JDm\r\n4EHSfCkDjhWkUW+13paP4QSYR4jR4IA+9h9QydYPdVIrZpsJ0oqR2a17cptf\r\nTYrHAfBV76sKDq/lE1yPCxrDs3EhhEZWeJI=\r\n=/YlC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.10.5_1654555937890_0.7829314516679007"},"_hasShrinkwrap":false,"deprecated":"when using stringify with arrayFormat comma, `[]` is appended on single-item arrays. Upgrade to v6.11.0 or downgrade to v6.10.4 to fix."},"6.11.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.11.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^21.0.0","aud":"^2.0.0","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.3","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","npmignore":"^0.3.0","nyc":"^10.3.2","object-inspect":"^1.12.2","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.5.3"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated","prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","publishConfig":{"ignore":["!dist/*","bower.json","component.json",".github/workflows"]},"gitHead":"56763c12ec4fbf723333cbb32371cbd386c33cbb","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.11.0","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==","shasum":"fd0d963446f7a65e1367e01abd85429453f0c37a","tarball":"https://registry.npmjs.org/qs/-/qs-6.11.0.tgz","fileCount":17,"unpackedSize":229455,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICdxpgh4uy5Z/t0PXOQnHrlz5UczCFALcCcn29YHBAlnAiEAia4Ywm2mqXFzcIiKvtvSMz+oILrw/OYvMbI9B+eiZng="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiuTbyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr8OxAAoMdGZi/qfAM0Rg+Ac2eZm1tQEcJteQodGu2MGsF6C/GHuvVv\r\nap0CZyQrYkLa1K8cUV0svvpX9HehGhCY50cuNNvlIgd5lPqIXFJRJZxCt2Gn\r\nPkQye6E7KmDmqGobf/ddyLMAmEqMzGq60CZGE2FUFJXkc/UdYxQOXmhHwhuA\r\ni6SZ0xfPQkAnOX4mANkBI43L5qxZuNMABow6d2/e/5X5nUbtoyU8i9Mm+AjI\r\nRgxV+58m6VpISFaxuHjW7oOXv85JeSjYSBvhaALHy8vHf/Qt0+7CTbUreWPm\r\nY6/Yj8l09NaZ0JydqqGlNfo/goqpdB7c2TpWTwL1PRDoJUOLPHxhrexx79F7\r\nVDm24XNy6/YLl7SZi6YHkvHaMF962QQehZUvRjAHTPI/5OvhkmAuWL1BNcNi\r\nKugDcF+96p2o6eAarxO6OkWrwpinzJ/X2T80VuQ2d3gcQmuMtPbv1H1r4X12\r\nC8BvIKia+9CS5KrzIRygtroRT6z3jqqhPecSZ/wZZ1zXI9DReR9od0SSPEJ0\r\n+OrTNriytlsNtq3SIYM/+cFh0Y/3UyZHl2c7IxO1QeQpbfOLTzrs4sJfyHjE\r\nsZy+AhxT4aNXjKjItpVjUzAlbMIop8liNXpuV3CQSUoLft3vf4Mv4NuTR4Yc\r\nut0/Qaqf8HcEQt8mdFd8bVQvEPio5QuLVL0=\r\n=0BwP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.11.0_1656305393791_0.10459431341975911"},"_hasShrinkwrap":false},"6.11.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.11.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^21.0.1","aud":"^2.0.2","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-symbols":"^1.0.3","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","npmignore":"^0.3.0","nyc":"^10.3.2","object-inspect":"^1.12.3","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.6.3"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated","prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","publishConfig":{"ignore":["!dist/*","bower.json","component.json",".github/workflows"]},"gitHead":"9dca37f15de317fe9ad0ced907cdf250ba310880","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.11.1","_nodeVersion":"19.7.0","_npmVersion":"9.5.0","dist":{"integrity":"sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==","shasum":"6c29dff97f0c0060765911ba65cbc9764186109f","tarball":"https://registry.npmjs.org/qs/-/qs-6.11.1.tgz","fileCount":17,"unpackedSize":234521,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFlgmdeGeAIJV9xcix5OZo3oY1dNkEumpegE+NOLyOg+AiEAvnnINt/n/15OWt0anjsniF0NCp3HI54ARIa8rb1QeBs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkBmg/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqdiRAAjX9hNqKyCcJaIF7DdHTeKoDknXBRCYKhm/YWO1oDwBS/6bqG\r\nRTCdkDkin2F0N3TCgIPuQcFnZ+QlArf0VtnQNZgBDhJIOMy5B0RvHiVZWRV/\r\nrIoR7FNZfTvXM6xM5w7dfoNCgAP20Q2ySAHuD/ydGO8WE+wcay6J9rMN4xSA\r\nkKryCTDWVTntAd/tqtpwHkbHZpMzRC8/bsaFR3feoSrapYOGJKNzXaHKcSsp\r\nb3HHVJ1XjXobiiXnvNLQEJHwzzUWy3nwKEq4YVGY6tH9Y21BuBXaNM6x6c9K\r\nxCwTYbQ597eWNn/RZDC7+EfF2s+cf8touZHLFt3VtAzyh9rlyepOwNQih7Gy\r\nQPNQw27gBHIzF+ql3Ui0EjKGSDWLySCNxpJ342+uTjBwVt/A0nHryR5lJb6i\r\nZRQ8ApMCT27cHgEr/tUkaDrp3go5cSgxBiXJPqZ8VeC5QKcLJg9+3pSU5zs1\r\n94sPnNqgP7sjsxgvwPrzuQP9zldh3q8a2QeCL+yBFsDadvrbE1VNlHZQuBmW\r\n3Q4UgUif/OQLJhJRgZtwhJvzLuEVwOh2ws0MRDtxYoC0jTOGCoHlq2/RvG/L\r\nxwY189A7XYvx5d4mXRa4RbfUqI599BGJqgaavuwca0p5pYk9R/Tfi5vht/Al\r\no0x2gzpozFpFvB68JsdWTBxBNJPqmL/26IA=\r\n=Rjbe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.11.1_1678141502979_0.23201624458108672"},"_hasShrinkwrap":false},"6.11.2":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.11.2","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.4"},"devDependencies":{"@ljharb/eslint-config":"^21.0.1","aud":"^2.0.2","browserify":"^16.5.2","eclint":"^2.8.1","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","has-override-mistake":"^1.0.0","has-property-descriptors":"^1.0.0","has-symbols":"^1.0.3","iconv-lite":"^0.5.1","in-publish":"^2.0.1","mkdirp":"^0.5.5","mock-property":"^1.0.0","npmignore":"^0.3.0","nyc":"^10.3.2","object-inspect":"^1.12.3","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.6.3"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated","prepublishOnly":"safe-publish-latest && npm run dist","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","publishConfig":{"ignore":["!dist/*","bower.json","component.json",".github/workflows"]},"gitHead":"410bdd3c8ae7f5d7ae9b52648b8642b8adc5e1c0","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_id":"qs@6.11.2","_nodeVersion":"20.1.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==","shasum":"64bea51f12c1f5da1bc01496f48ffcff7c69d7d9","tarball":"https://registry.npmjs.org/qs/-/qs-6.11.2.tgz","fileCount":18,"unpackedSize":241132,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB+fMu4NOJq7nmFfNqhMD2qf8cmFsuMCwoggeSq9mZ7/AiEAkTtWfoOsoVOR5sxAI654c6P4/cb9/GZxSzo5aaCrjkE="}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.11.2_1684166911484_0.2375668376641622"},"_hasShrinkwrap":false},"6.12.0":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.12.0","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","sideEffects":false,"contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.6"},"devDependencies":{"@browserify/envify":"^6.0.0","@browserify/uglifyify":"^6.0.0","@ljharb/eslint-config":"^21.1.0","aud":"^2.0.4","browserify":"^16.5.2","bundle-collapser":"^1.4.0","common-shakeify":"~1.0.0","eclint":"^2.8.1","es-value-fixtures":"^1.4.2","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","glob":"=10.3.7","has-override-mistake":"^1.0.1","has-property-descriptors":"^1.0.2","has-symbols":"^1.0.3","iconv-lite":"^0.5.1","in-publish":"^2.0.1","jackspeak":"=2.1.1","mkdirp":"^0.5.5","mock-property":"^1.0.3","module-deps":"^6.2.3","npmignore":"^0.3.1","nyc":"^10.3.2","object-inspect":"^1.13.1","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.7.5","unassertify":"^3.0.1"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated && npm run dist","prepublishOnly":"safe-publish-latest","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs -g unassertify -g @browserify/envify -g [@browserify/uglifyify --mangle.keep_fnames --compress.keep_fnames --format.indent_level=1 --compress.arrows=false --compress.passes=4 --compress.typeofs=false] -p common-shakeify -p bundle-collapser/plugin lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","publishConfig":{"ignore":["!dist/*","bower.json","component.json",".github/workflows","logos"]},"_id":"qs@6.12.0","gitHead":"062334aa584809829822c077f5f9f41c1e253dab","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==","shasum":"edd40c3b823995946a8a0b1f208669c7a200db77","tarball":"https://registry.npmjs.org/qs/-/qs-6.12.0.tgz","fileCount":18,"unpackedSize":245120,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgj2uVDUIu2e6Vjdz9YIZamGp0HYy9szXE3IUckG/NaAIhAIxvDNn8r7pR7mmr7eql4zM/RSiwoFuzZ8oDPYFkCP/i"}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.12.0_1709748827789_0.6296145314628603"},"_hasShrinkwrap":false},"6.12.1":{"name":"qs","description":"A querystring parser that supports nesting and arrays, with a depth limit","homepage":"https://github.com/ljharb/qs","version":"6.12.1","repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"funding":{"url":"https://github.com/sponsors/ljharb"},"main":"lib/index.js","sideEffects":false,"contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}],"keywords":["querystring","qs","query","url","parse","stringify"],"engines":{"node":">=0.6"},"dependencies":{"side-channel":"^1.0.6"},"devDependencies":{"@browserify/envify":"^6.0.0","@browserify/uglifyify":"^6.0.0","@ljharb/eslint-config":"^21.1.0","aud":"^2.0.4","browserify":"^16.5.2","bundle-collapser":"^1.4.0","common-shakeify":"~1.0.0","eclint":"^2.8.1","es-value-fixtures":"^1.4.2","eslint":"=8.8.0","evalmd":"^0.0.19","for-each":"^0.3.3","glob":"=10.3.7","has-override-mistake":"^1.0.1","has-property-descriptors":"^1.0.2","has-symbols":"^1.0.3","iconv-lite":"^0.5.1","in-publish":"^2.0.1","jackspeak":"=2.1.1","mkdirp":"^0.5.5","mock-property":"^1.0.3","module-deps":"^6.2.3","npmignore":"^0.3.1","nyc":"^10.3.2","object-inspect":"^1.13.1","qs-iconv":"^1.0.4","safe-publish-latest":"^2.0.0","safer-buffer":"^2.1.2","tape":"^5.7.5","unassertify":"^3.0.1"},"scripts":{"prepack":"npmignore --auto --commentLines=autogenerated && npm run dist","prepublishOnly":"safe-publish-latest","prepublish":"not-in-publish || npm run prepublishOnly","pretest":"npm run --silent readme && npm run --silent lint","test":"npm run tests-only","tests-only":"nyc tape 'test/**/*.js'","posttest":"aud --production","readme":"evalmd README.md","postlint":"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)","lint":"eslint --ext=js,mjs .","dist":"mkdirp dist && browserify --standalone Qs -g unassertify -g @browserify/envify -g [@browserify/uglifyify --mangle.keep_fnames --compress.keep_fnames --format.indent_level=1 --compress.arrows=false --compress.passes=4 --compress.typeofs=false] -p common-shakeify -p bundle-collapser/plugin lib/index.js > dist/qs.js"},"license":"BSD-3-Clause","publishConfig":{"ignore":["!dist/*","bower.json","component.json",".github/workflows","logos","tea.yaml"]},"_id":"qs@6.12.1","gitHead":"59d765f6fb350ae33002003a5e37b65fdf31776c","bugs":{"url":"https://github.com/ljharb/qs/issues"},"_nodeVersion":"21.7.2","_npmVersion":"10.5.0","dist":{"integrity":"sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==","shasum":"39422111ca7cbdb70425541cba20c7d7b216599a","tarball":"https://registry.npmjs.org/qs/-/qs-6.12.1.tgz","fileCount":18,"unpackedSize":247047,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNGMI4dtDJeL8Kvi03KpGT9bPl80ZX3m7ZeDguwhL4OgIhAI9jJVNVGbzp/K9zoRPuqc8xVlofZsdrRS0Q4S4a6XCx"}]},"_npmUser":{"name":"ljharb","email":"ljharb@gmail.com"},"directories":{},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qs_6.12.1_1712960664945_0.12975970608601028"},"_hasShrinkwrap":false}},"maintainers":[{"name":"nlf","email":"quitlahok@gmail.com"},{"name":"ljharb","email":"ljharb@gmail.com"}],"time":{"modified":"2024-05-06T13:39:44.813Z","created":"2011-02-04T04:40:23.617Z","0.0.1":"2011-02-04T04:40:23.984Z","0.0.2":"2011-02-07T16:45:02.442Z","0.0.3":"2011-02-09T00:52:16.616Z","0.0.4":"2011-02-09T20:45:35.890Z","0.0.5":"2011-02-10T23:45:02.307Z","0.0.6":"2011-02-14T22:27:23.241Z","0.0.7":"2011-03-13T17:20:41.673Z","0.1.0":"2011-04-13T18:07:22.394Z","0.2.0":"2011-06-29T16:33:55.231Z","0.3.0":"2011-07-19T19:07:48.886Z","0.3.1":"2011-11-04T16:33:52.613Z","0.3.2":"2011-11-09T03:42:13.569Z","0.4.0":"2011-11-22T02:27:15.971Z","0.4.1":"2012-01-26T13:40:54.775Z","0.4.2":"2012-02-08T21:10:43.986Z","0.5.0":"2012-05-04T21:42:09.623Z","0.5.1":"2012-09-18T18:43:17.048Z","0.5.2":"2012-11-14T19:56:00.323Z","0.5.3":"2012-12-10T00:18:05.350Z","0.5.4":"2013-03-15T23:33:06.012Z","0.5.5":"2013-03-20T19:37:04.472Z","0.5.6":"2013-04-09T17:16:57.783Z","0.6.0":"2013-04-23T15:59:26.281Z","0.6.1":"2013-04-26T20:11:41.989Z","0.6.2":"2013-05-02T20:58:43.034Z","0.6.3":"2013-05-03T20:05:29.458Z","0.6.4":"2013-05-07T14:51:56.116Z","0.6.5":"2013-05-13T15:40:34.969Z","0.6.6":"2013-12-03T16:46:29.059Z","1.0.0":"2014-08-04T22:27:58.076Z","1.0.1":"2014-08-05T21:32:57.002Z","1.0.2":"2014-08-06T00:17:36.599Z","1.1.0":"2014-08-06T17:42:49.341Z","1.2.0":"2014-08-07T14:01:10.992Z","1.2.1":"2014-08-09T01:37:21.982Z","1.2.2":"2014-08-14T20:14:29.160Z","2.0.0":"2014-08-25T20:02:15.954Z","2.1.0":"2014-08-25T22:43:41.944Z","2.2.0":"2014-08-27T16:34:02.261Z","2.2.1":"2014-08-28T20:36:15.270Z","2.2.2":"2014-08-29T20:34:11.657Z","2.2.3":"2014-09-05T18:30:40.705Z","2.2.4":"2014-09-18T22:58:21.311Z","2.2.5":"2014-10-22T21:38:19.356Z","2.3.0":"2014-10-22T21:47:54.756Z","2.3.1":"2014-10-23T16:26:22.009Z","2.3.2":"2014-10-28T00:07:01.669Z","2.3.3":"2014-11-14T00:54:19.016Z","2.4.0":"2015-03-12T17:22:55.602Z","2.4.1":"2015-03-13T23:38:45.229Z","2.4.2":"2015-05-09T20:55:52.199Z","3.0.0":"2015-05-22T19:34:21.873Z","3.1.0":"2015-05-27T16:11:47.363Z","4.0.0":"2015-07-02T18:33:51.252Z","5.0.0":"2015-08-27T17:43:00.325Z","5.1.0":"2015-09-11T17:10:21.549Z","5.2.0":"2015-10-07T17:36:24.037Z","6.0.0":"2015-11-03T03:02:36.639Z","6.0.1":"2015-11-24T17:04:02.325Z","6.0.2":"2016-01-17T22:58:43.204Z","6.1.0":"2016-02-04T05:59:45.711Z","6.2.0":"2016-05-08T23:15:52.801Z","5.2.1":"2016-07-20T19:37:41.185Z","6.2.1":"2016-07-20T20:02:09.943Z","6.3.0":"2016-10-17T00:26:31.012Z","6.3.1":"2017-02-16T04:40:59.014Z","6.1.1":"2017-02-16T06:41:46.130Z","6.0.3":"2017-02-16T07:05:51.249Z","6.2.2":"2017-02-16T07:44:35.992Z","6.4.0":"2017-03-06T07:03:28.551Z","6.3.2":"2017-03-06T09:02:15.066Z","6.2.3":"2017-03-06T16:50:31.546Z","6.1.2":"2017-03-06T16:50:51.782Z","6.0.4":"2017-03-06T16:51:48.044Z","6.5.0":"2017-06-28T07:08:19.489Z","6.5.1":"2017-09-09T07:54:59.287Z","6.5.2":"2018-05-04T06:06:13.890Z","6.6.0":"2018-11-25T06:44:41.677Z","6.7.0":"2019-03-22T20:48:51.184Z","6.8.0":"2019-08-17T02:45:35.763Z","6.9.0":"2019-09-21T22:26:19.096Z","6.9.1":"2019-11-08T06:46:35.355Z","6.9.2":"2020-03-22T15:39:34.376Z","6.8.1":"2020-03-24T04:47:49.232Z","6.7.1":"2020-03-24T15:25:23.409Z","6.7.2":"2020-03-25T19:17:23.223Z","6.8.2":"2020-03-25T19:47:25.334Z","6.9.3":"2020-03-25T20:35:57.060Z","6.9.4":"2020-05-03T21:52:50.717Z","6.9.5":"2021-01-13T16:29:50.613Z","6.9.6":"2021-01-14T04:53:48.650Z","6.10.0":"2021-03-18T19:39:17.956Z","6.10.1":"2021-03-22T03:53:52.823Z","6.10.2":"2021-12-06T05:47:27.638Z","6.2.4":"2022-01-11T05:57:35.218Z","6.3.3":"2022-01-11T05:59:16.690Z","6.4.1":"2022-01-11T05:59:22.055Z","6.5.3":"2022-01-11T05:59:27.508Z","6.6.1":"2022-01-11T05:59:34.289Z","6.7.3":"2022-01-11T05:59:39.213Z","6.8.3":"2022-01-11T05:59:46.325Z","6.9.7":"2022-01-11T05:59:51.851Z","6.10.3":"2022-01-11T06:00:21.635Z","6.10.4":"2022-06-06T19:07:09.851Z","6.10.5":"2022-06-06T22:52:18.062Z","6.11.0":"2022-06-27T04:49:53.976Z","6.11.1":"2023-03-06T22:25:03.220Z","6.11.2":"2023-05-15T16:08:31.665Z","6.12.0":"2024-03-06T18:13:47.987Z","6.12.1":"2024-04-12T22:24:25.107Z"},"repository":{"type":"git","url":"git+https://github.com/ljharb/qs.git"},"users":{"291296283":true,"fgribreau":true,"m42am":true,"maxmaximov":true,"dubban":true,"dknell":true,"devonning":true,"youxiachai":true,"jimnox":true,"josephdavisco":true,"mahnunchik":true,"h02e56":true,"fanchangyong":true,"zhangyaochun":true,"fampinheiro":true,"ruiquelhas":true,"xpepermint":true,"yvesm":true,"rgraves90":true,"bbrown":true,"columbennett":true,"gaafar":true,"Prestaul":true,"gdbtek":true,"prestaul":true,"markthethomas":true,"qbylucky":true,"sahilsk":true,"amirmehmood":true,"simplyianm":true,"brentonhouse":true,"itonyyo":true,"chill":true,"mlowe":true,"hbzhangmao":true,"debearloper":true,"xiaokaike":true,"iamwiz":true,"qqqppp9998":true,"etsit":true,"jesusgoku":true,"chaseshu":true,"intuitivcloud":true,"fkamani":true,"bpatel":true,"nanook":true,"panlw":true,"akiva":true,"x4devs":true,"zaggen":true,"koulmomo":true,"kparkov":true,"bhill":true,"newswim":true,"bjoshuanoah":true,"sakthiifnotec":true,"poeticninja":true,"vbv":true,"koslun":true,"antanst":true,"stany":true,"js3692":true,"justinanastos":true,"nickeltobias":true,"bojand":true,"warp-lab":true,"nmccready":true,"tobiasnickel":true,"nichoth":true,"meetravi":true,"wkaifang":true,"dexteryy":true,"slurm":true,"wangnan0610":true,"nomemires":true,"sammok2003":true,"bhenav":true,"santosharakere":true,"illbullet":true,"princetoad":true,"jcloutz":true,"zlobin":true,"snowdream":true,"kankungyip":true,"ddkothari":true,"programmer.severson":true,"cestrensem":true,"anlijudavid":true,"kizzlebot":true,"gibson":true,"mrmartineau":true,"h0ward":true,"abuelwafa":true,"jmsherry":true,"djviolin":true,"rsp":true,"kistoryg":true,"nicodinh":true,"arikfr":true,"mojaray2k":true,"mhaidarh":true,"ximex":true,"sopepos":true,"largepuma":true,"jrobinsonc":true,"wu0792":true,"ericfish007":true,"shakakira":true,"kodekracker":true,"shangsinian":true,"chimit":true,"tiendq":true,"rubychen":true,"fengmiaosen":true,"eswat2":true,"xieranmaya":true,"lightway82":true,"alert1983":true,"oliverhuang":true,"shuoshubao":true,"raojs":true,"hyteer":true,"tomchao":true,"sadmansamee":true,"yl2014":true,"myorkgitis":true,"st.teneff":true,"danielye":true,"miloc":true,"brandonb927":true,"wangshijun":true,"cathay":true,"softdev-zeus":true,"vae-rain":true,"superchenney":true,"xtx1130":true,"asaupup":true,"aldo-sanchez":true,"jaeger":true,"xfloops":true,"fang0408":true,"zhenguo.zhao":true,"iceriver2":true,"uojo":true,"gemini5":true,"dnp1204":true,"galenandrew":true,"fabioper":true,"xmwx38":true,"nuwaio":true,"sevit":true,"dillonace":true,"space_cat_lady":true,"zwwggg":true,"zuojiang":true,"karzanosman984":true,"justjavac":true,"yikuo":true,"program247365":true,"seangenabe":true,"mobeicaoyuan":true,"allen_lyu":true,"asadm2706":true,"redstrike":true,"trankhanh":true,"uptonking":true,"dylanh724":true,"ryaned":true,"kamikadze4game":true,"alu":true,"wisetc":true,"black-black-cat":true,"likkli":true,"muzi131313":true,"buzuli":true,"wadehuang36":true,"arcticicestudio":true,"itesic":true,"pantyuhind":true,"belcour":true,"knoja4":true,"yanghcc":true,"jalik":true,"hdusy":true,"lius971125":true,"flumpus-dev":true,"cologler":true,"vcboom":true},"keywords":["querystring","qs","query","url","parse","stringify"],"bugs":{"url":"https://github.com/ljharb/qs/issues"},"readme":"<p align=\"center\">\n <img alt=\"qs\" src=\"./logos/banner_default.png\" width=\"800\" />\n</p>\n\n# qs <sup>[![Version Badge][npm-version-svg]][package-url]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n foo: {\n bar: 'baz'\n }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties.\n*WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten.\nAlways be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n foo: {\n bar: {\n baz: 'foobarbaz'\n }\n }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep.\nThis means if you attempt to parse a string like `'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n a: {\n b: {\n c: {\n d: {\n e: {\n f: {\n '[g][h][i]': 'j'\n }\n }\n }\n }\n }\n }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\nOption `decodeDotInKeys` can be used to decode dots in keys\nNote: it implies `allowDots`, so `parse` will error if you set `decodeDotInKeys` to `true`, and `allowDots` to `false`.\n\n```javascript\nvar withDots = qs.parse('name%252Eobj.first=John&name%252Eobj.last=Doe', { decodeDotInKeys: true });\nassert.deepEqual(withDots, { 'name.obj': { first: 'John', last: 'Doe' }});\n```\n\nOption `allowEmptyArrays` can be used to allowing empty array values in object\n```javascript\nvar withEmptyArrays = qs.parse('foo[]&bar=baz', { allowEmptyArrays: true });\nassert.deepEqual(withEmptyArrays, { foo: [], bar: 'baz' });\n```\n\nOption `duplicates` can be used to change the behavior when duplicate keys are encountered\n```javascript\nassert.deepEqual(qs.parse('foo=bar&foo=baz'), { foo: ['bar', 'baz'] });\nassert.deepEqual(qs.parse('foo=bar&foo=baz', { duplicates: 'combine' }), { foo: ['bar', 'baz'] });\nassert.deepEqual(qs.parse('foo=bar&foo=baz', { duplicates: 'first' }), { foo: 'bar' });\nassert.deepEqual(qs.parse('foo=bar&foo=baz', { duplicates: 'last' }), { foo: 'baz' });\n```\n\nIf you have to deal with legacy browsers or services, there's also support for decoding percent-encoded octets as iso-8859-1:\n\n```javascript\nvar oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' });\nassert.deepEqual(oldCharset, { a: '§' });\n```\n\nSome services add an initial `utf8=✓` value to forms so that old Internet Explorer versions are more likely to submit the form as utf-8.\nAdditionally, the server can check the value against wrong encodings of the checkmark character and detect that a query string or `application/x-www-form-urlencoded` body was *not* sent as utf-8, eg. if the form had an `accept-charset` parameter or the containing page had a different character set.\n\n**qs** supports this mechanism via the `charsetSentinel` option.\nIf specified, the `utf8` parameter will be omitted from the returned object.\nIt will be used to switch to `iso-8859-1`/`utf-8` mode depending on how the checkmark is encoded.\n\n**Important**: When you specify both the `charset` option and the `charsetSentinel` option, the `charset` will be overridden when the request contains a `utf8` parameter from which the actual charset can be deduced.\nIn that sense the `charset` will behave as the default charset rather than the authoritative charset.\n\n```javascript\nvar detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', {\n charset: 'iso-8859-1',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsUtf8, { a: 'ø' });\n\n// Browsers encode the checkmark as ✓ when submitting as iso-8859-1:\nvar detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', {\n charset: 'utf-8',\n charsetSentinel: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: 'ø' });\n```\n\nIf you want to decode the `&#...;` syntax to the actual character, you can specify the `interpretNumericEntities` option as well:\n\n```javascript\nvar detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', {\n charset: 'iso-8859-1',\n interpretNumericEntities: true\n});\nassert.deepEqual(detectedAsIso8859_1, { a: '☺' });\n```\n\nIt also works when the charset has been detected in `charsetSentinel` mode.\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number to create an array.\nWhen creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving their order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nYou may also use `allowSparse` option to parse sparse arrays:\n\n```javascript\nvar sparseArray = qs.parse('a[1]=2&a[3]=5', { allowSparse: true });\nassert.deepEqual(sparseArray, { a: [, '2', , '5'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`.\nAny array members with an index of greater than `20` will instead be converted to an object with the index as the key.\nThis is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\nSome people use comma to join array, **qs** can parse it:\n```javascript\nvar arraysOfObjects = qs.parse('a=b,c', { comma: true })\nassert.deepEqual(arraysOfObjects, { a: ['b', 'c'] })\n```\n(_this cannot convert nested objects, such as `a={b:1},{c:d}`_)\n\n### Parsing primitive/scalar values (numbers, booleans, null, etc)\n\nBy default, all values are parsed as strings.\nThis behavior will not change and is explained in [issue #91](https://github.com/ljharb/qs/issues/91).\n\n```javascript\nvar primitiveValues = qs.parse('a=15&b=true&c=null');\nassert.deepEqual(primitiveValues, { a: '15', b: 'true', c: 'null' });\n```\n\nIf you wish to auto-convert values which look like numbers, booleans, and other values into their primitive counterparts, you can use the [query-types Express JS middleware](https://github.com/xpepermint/query-types) which will auto-convert all request query parameters.\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n // Passed in values `a`, `b`, `c`\n return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n // Passed in values `x`, `z`\n return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n if (type === 'key') {\n return // Encoded key\n } else if (type === 'value') {\n return // Encoded value\n }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n if (type === 'key') {\n return // Decoded key\n } else if (type === 'value') {\n return // Decoded value\n }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity.\nPlease note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, they follow the `arrayFormat` option, which defaults to `indices`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`, or to be more explicit, the `arrayFormat` option to `repeat`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })\n// 'a=b,c'\n```\n\nNote: when using `arrayFormat` set to `'comma'`, you can also pass the `commaRoundTrip` option set to `true` or `false`, to append `[]` on single-item arrays, so that they can round trip through a parse.\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nYou may encode the dot notation in the keys of object with option `encodeDotInKeys` by setting it to `true`:\nNote: it implies `allowDots`, so `stringify` will error if you set `decodeDotInKeys` to `true`, and `allowDots` to `false`.\nCaveat: when `encodeValuesOnly` is `true` as well as `encodeDotInKeys`, only dots in keys and nothing else will be encoded.\n```javascript\nqs.stringify({ \"name.obj\": { \"first\": \"John\", \"last\": \"Doe\" } }, { allowDots: true, encodeDotInKeys: true })\n// 'name%252Eobj.first=John&name%252Eobj.last=Doe'\n```\n\nYou may allow empty array values by setting the `allowEmptyArrays` option to `true`:\n```javascript\nqs.stringify({ foo: [], bar: 'baz' }, { allowEmptyArrays: true });\n// 'foo[]&bar=baz'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n 'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value.\nOtherwise, if you pass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n if (prefix == 'b') {\n // Return an `undefined` value to omit a property.\n return;\n }\n if (prefix == 'e[f]') {\n return value.getTime();\n }\n if (prefix == 'e[g][0]') {\n return value * 2;\n }\n return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\nYou could also use `filter` to inject custom serialization for user defined types.\nConsider you're working with some api that expects query strings of the format for ranges:\n\n```\nhttps://domain.com/endpoint?range=30...70\n```\n\nFor which you model as:\n\n```javascript\nclass Range {\n constructor(from, to) {\n this.from = from;\n this.to = to;\n }\n}\n```\n\nYou could _inject_ a custom serializer to handle values of this type:\n\n```javascript\nqs.stringify(\n {\n range: new Range(30, 70),\n },\n {\n filter: (prefix, value) => {\n if (value instanceof Range) {\n return `${value.from}...${value.to}`;\n }\n // serialize the usual way\n return value;\n },\n }\n);\n// range=30...70\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs.\nBoth are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\nIf you're communicating with legacy systems, you can switch to `iso-8859-1` using the `charset` option:\n\n```javascript\nvar iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' });\nassert.equal(iso, '%E6=%E6');\n```\n\nCharacters that don't exist in `iso-8859-1` will be converted to numeric entities, similar to what browsers do:\n\n```javascript\nvar numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' });\nassert.equal(numeric, 'a=%26%239786%3B');\n```\n\nYou can use the `charsetSentinel` option to announce the character by including an `utf8=✓` parameter with the proper encoding if the checkmark, similar to what Ruby on Rails and others do when submitting forms.\n\n```javascript\nvar sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true });\nassert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA');\n\nvar isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' });\nassert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`, and `iso-8859-1` support is also built in via the `charset` parameter.\n\nIf you wish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは!' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications.\nSave time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.\n[Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n\n## Acknowledgements\n\nqs logo by [NUMI](https://github.com/numi-hq/open-design):\n\n[<img src=\"https://raw.githubusercontent.com/numi-hq/open-design/main/assets/numi-lockup.png\" alt=\"NUMI Logo\" style=\"width: 200px;\"/>](https://numi.tech/?ref=qs)\n","readmeFilename":"README.md","homepage":"https://github.com/ljharb/qs","license":"BSD-3-Clause","contributors":[{"name":"Jordan Harband","email":"ljharb@gmail.com","url":"http://ljharb.codes"}]}
|