commit 84c825e8a71b74ee434ccc8a7efe7d4607ed2140 Author: Ângelo Tadeucci Date: Fri May 19 15:22:48 2023 -0300 Initial commit diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..ed317f00e --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +MONGODB_URL='mongodb://127.0.0.1:27017/wf_emulator' +PORT=3001 + +DATABASE_PORT=27017 +DATABASE_USERNAME=root +DATABASE_PASSWORD=root + diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..66a81ebf5 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,28 @@ +{ + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + "plugins": ["@typescript-eslint", "prettier"], + "env": { + "browser": true, + "es6": true, + "node": true + }, + "rules": { + "prettier/prettier": "error", + "@typescript-eslint/semi": ["error"], + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/restrict-plus-operands": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], + "no-case-declarations": "off" + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json" + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dfe077042 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..27a447366 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/build + +/.env +/static/data/* \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..4fd021952 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..2f852aef8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +{ + "tabWidth": 2, + "useTabs": false, + "endOfLine": "auto", + "trailingComma": "none", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": false, + "printWidth": 120, + "proseWrap": "never", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": false, + "vueIndentScriptAndStyle": true, + "arrowParens": "avoid", + "bracketSpacing": true +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..c218511b2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM mongo as base + +EXPOSE 27017 + +CMD ["mongod"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..e62ec04cd --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 000000000..db54518ef --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# wf-emulator + Warframe Emulator diff --git a/config.json b/config.json new file mode 100644 index 000000000..f1d0f9892 --- /dev/null +++ b/config.json @@ -0,0 +1,5 @@ +{ + "autoCreateAccount": true, + "buildLabel": "2023.05.12.11.43/Er1Pres+jT2iCmIPRTdcDg", + "matchmakingBuildId": "4920386201513015989" +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..085c452e4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: "3.9" + +services: + mongodb: + container_name: mongodb + image: mongodb + restart: always + build: + context: . + dockerfile: Dockerfile + target: base + environment: + MONGO_INITDB_ROOT_USERNAME: ${DATABASE_USERNAME} + MONGO_INITDB_ROOT_PASSWORD: ${DATABASE_PASSWORD} + ports: + - ${DATABASE_PORT}:${DATABASE_PORT} + expose: + - "${DATABASE_PORT}" + networks: + - docker + +networks: + docker: + external: true diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..ee3525bf3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3233 @@ +{ + "name": "wf-emulator", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wf-emulator", + "version": "0.1.0", + "license": "GNU", + "dependencies": { + "dotenv": "^16.0.3", + "express": "^5.0.0-beta.1", + "mongoose": "^7.1.1" + }, + "devDependencies": { + "@tsconfig/node20": "^1.0.0", + "@types/body-parser": "^1.19.2", + "@types/express": "^4.17.17", + "@types/morgan": "^1.9.4", + "@typescript-eslint/eslint-plugin": "^5.59.2", + "@typescript-eslint/parser": "^5.59.2", + "eslint": "^8.40.0", + "eslint-plugin-prettier": "^4.2.1", + "morgan": "^1.10.0", + "prettier": "^2.8.8", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.0.4" + }, + "engines": { + "node": ">=18.15.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@tsconfig/node20": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-1.0.0.tgz", + "integrity": "sha512-AwbXtpWEaRUjbGVwdlusNqwet+jeSk3Nnqf/8+77WJ1/9d6xnqs2QpE9Pdwv8RCoXxtMedWEtlmWY+/irBPcUw==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.34", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", + "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/morgan": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", + "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", + "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", + "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/type-utils": "5.59.2", + "@typescript-eslint/utils": "5.59.2", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", + "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", + "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", + "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/utils": "5.59.2", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", + "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", + "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", + "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", + "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "2.0.0-beta.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.0.0-beta.1.tgz", + "integrity": "sha512-I1v2bt2OdYqtmk8nEFZuEf+9Opb30DphYwTPDbgg/OorSAoJOuTpWyDrZaSWQw7FdoevbBRCP2+9z/halXSWcA==", + "dependencies": { + "bytes": "3.1.1", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.2.0.tgz", + "integrity": "sha512-HevkSpDbpUfsrHWmWiAsNavANKYIErV2ePXllp1bwq5CDreAaFVj6RVlZpJnxK4WWDCJ/5jMUpaY6G526q3Hjg==", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.0.0-beta.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.0.0-beta.1.tgz", + "integrity": "sha512-KPtBrlZoQu2Ps0Ce/Imqtq73AB0KBJ8Gx59yZQ3pmDJU2/LhcoZETo03oSgtTQufbcLXt/WBITk/jMjl/WMyrQ==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "3.0.0", + "body-parser": "2.0.0-beta.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.1", + "cookie-signature": "1.0.6", + "debug": "3.1.0", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "mime-types": "~2.1.34", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-is-absolute": "1.0.1", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", + "range-parser": "~1.2.1", + "router": "2.0.0-beta.1", + "safe-buffer": "5.2.1", + "send": "1.0.0-beta.1", + "serve-static": "2.0.0-beta.1", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/express/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.3.0.tgz", + "integrity": "sha512-Wy/sbahguL8c3TXQWXmuBabiLD+iVmz+tOgQf+FwkCjhUIorqbAxRbbz00g4ZoN4sXIPwpAlTANMaGRjGGTikQ==", + "dependencies": { + "bson": "^5.2.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.201.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.1.1.tgz", + "integrity": "sha512-AIxaWwGY+td7QOMk4NgK6fbRuGovFyDzv65nU1uj1DsUh3lpjfP3iFYHSR+sUKrs7nbp19ksLlRXkmInBteSCA==", + "dependencies": { + "bson": "^5.2.0", + "kareem": "2.5.1", + "mongodb": "5.3.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "dependencies": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.0.0-beta.1", + "resolved": "https://registry.npmjs.org/router/-/router-2.0.0-beta.1.tgz", + "integrity": "sha512-GLoYgkhAGAiwVda5nt6Qd4+5RAPuQ4WIYLlZ+mxfYICI+22gnIB3eCfmhgV8+uJNPS1/39DOYi/vdrrz0/ouKA==", + "dependencies": { + "array-flatten": "3.0.0", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "3.2.0", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.0.0-beta.1.tgz", + "integrity": "sha512-OKTRokcl/oo34O8+6aUpj8Jf2Bjw2D0tZzmX0/RvyfVC9ZOZW+HPAWAlhS817IsRaCnzYX1z++h2kHFr2/KNRg==", + "dependencies": { + "debug": "3.1.0", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime-types": "~2.1.34", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/send/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "2.0.0-beta.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.0.0-beta.1.tgz", + "integrity": "sha512-DEJ9on/tQeFO2Omj7ovT02lCp1YgP4Kb8W2lv2o/4keTFAbgc8HtH3yPd47++2wv9lvQeqiA7FHFDe5+8c4XpA==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "1.0.0-beta.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..d2ba2a97b --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "wf-emulator", + "version": "0.1.0", + "description": "WF Emulator", + "main": "index.ts", + "scripts": { + "start": "node build/index.js", + "dev": "ts-node-dev --openssl-legacy-provider -r tsconfig-paths/register src/index.ts", + "build": "tsc", + "lint": "eslint --ext .ts ." + }, + "license": "GNU", + "dependencies": { + "dotenv": "^16.0.3", + "express": "^5.0.0-beta.1", + "mongoose": "^7.1.1" + }, + "devDependencies": { + "@tsconfig/node20": "^1.0.0", + "@types/body-parser": "^1.19.2", + "@types/express": "^4.17.17", + "@types/morgan": "^1.9.4", + "@typescript-eslint/eslint-plugin": "^5.59.2", + "@typescript-eslint/parser": "^5.59.2", + "eslint": "^8.40.0", + "eslint-plugin-prettier": "^4.2.1", + "morgan": "^1.10.0", + "prettier": "^2.8.8", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.0.4" + }, + "engines": { + "node": ">=18.15.0", + "npm": ">=9.5.0" + } +} diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 000000000..775ca81f0 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,40 @@ +import express from "express"; +//import { loginRouter } from "./routes/login"; + +import { requestLogger, unknownEndpointHandler } from "@/src/middleware/middleware"; + +import { apiRouter } from "@/src/routes/api"; +//import { testRouter } from "@/src/routes/test"; +import { cacheRouter } from "@/src/routes/cache"; +import { dynamicController } from "./routes/dynamic"; +import { customRouter } from "./routes/custom"; + +import bodyParser from "body-parser"; + +import { connectDatabase } from "./services/mongoService"; +import morgan from "morgan"; +import { steamPacksController } from "./controllers/misc/steamPacksController"; + +void connectDatabase(); + +const app = express(); + +app.use(bodyParser.raw()); +app.use(express.json()); +app.use(bodyParser.text()); +app.use(morgan("dev")); +app.use(requestLogger); + +app.use("/api", apiRouter); +//app.use("/test", testRouter); +app.use("/", cacheRouter); +app.use("/custom", customRouter); +app.use("/:id/dynamic", dynamicController); + +app.post("/pay/steamPacks.php", steamPacksController); + +app.use(unknownEndpointHandler); + +//app.use(errorHandler) + +export { app }; diff --git a/src/controllers/api/checkDailyMissionBonusController.ts b/src/controllers/api/checkDailyMissionBonusController.ts new file mode 100644 index 000000000..a128a606f --- /dev/null +++ b/src/controllers/api/checkDailyMissionBonusController.ts @@ -0,0 +1,16 @@ +import { RequestHandler } from "express"; + +const checkDailyMissionBonusController: RequestHandler = (_req, res) => { + const data = Buffer.from([ + 0x44, 0x61, 0x69, 0x6c, 0x79, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x3a, 0x31, + 0x2d, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x50, 0x56, 0x50, 0x57, 0x69, 0x6e, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x3a, 0x31, + 0x0a + ]); + res.writeHead(200, { + "Content-Type": "text/html", + "Content-Length": data.length + }); + res.end(data); +}; + +export { checkDailyMissionBonusController }; diff --git a/src/controllers/api/dronesController.ts b/src/controllers/api/dronesController.ts new file mode 100644 index 000000000..2bc67e662 --- /dev/null +++ b/src/controllers/api/dronesController.ts @@ -0,0 +1,11 @@ +import { RequestHandler } from "express"; + +const dronesController: RequestHandler = (_req, res) => { + res.writeHead(200, { + "Content-Type": "text/html", + "Content-Length": "3" + }); + res.end(Buffer.from([0x7b, 0x7d, 0x0a])); +}; + +export { dronesController }; diff --git a/src/controllers/api/findSessionsController.ts b/src/controllers/api/findSessionsController.ts new file mode 100644 index 000000000..8f9b2265a --- /dev/null +++ b/src/controllers/api/findSessionsController.ts @@ -0,0 +1,16 @@ +import { RequestHandler } from "express"; + +const findSessionsController: RequestHandler = (_req, res) => { + const data = Buffer.from([ + 0x7b, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x49, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d + ]); + + res.writeHead(200, { + "Content-Type": "text/html", + "Content-Length": data.length + }); + res.end(data); +}; + +export { findSessionsController }; diff --git a/src/controllers/api/getAllianceController.ts b/src/controllers/api/getAllianceController.ts new file mode 100644 index 000000000..c03423c1b --- /dev/null +++ b/src/controllers/api/getAllianceController.ts @@ -0,0 +1,7 @@ +import { RequestHandler } from "express-serve-static-core"; + +const getAllianceController: RequestHandler = (_req, res) => { + res.sendStatus(200); +}; + +export { getAllianceController }; diff --git a/src/controllers/api/getFriendsController.ts b/src/controllers/api/getFriendsController.ts new file mode 100644 index 000000000..3a173477f --- /dev/null +++ b/src/controllers/api/getFriendsController.ts @@ -0,0 +1,12 @@ +import { Request, Response } from "express"; + +export default (_request: Request, response: Response) => { + response.writeHead(200, { + //Connection: "keep-alive", + //"Content-Encoding": "gzip", + "Content-Type": "text/html", + // charset: "UTF - 8", + "Content-Length": "3" + }); + response.end(Buffer.from([0x7b, 0x7d, 0x0a])); +}; diff --git a/src/controllers/api/getIgnoredUsersController.ts b/src/controllers/api/getIgnoredUsersController.ts new file mode 100644 index 000000000..dfeedb54d --- /dev/null +++ b/src/controllers/api/getIgnoredUsersController.ts @@ -0,0 +1,16 @@ +import { RequestHandler } from "express"; + +const getIgnoredUsersController: RequestHandler = (_req, res) => { + res.writeHead(200, { + "Content-Type": "text/html", + "Content-Length": "3" + }); + res.end( + Buffer.from([ + 0x7b, 0x22, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x3a, 0x38, 0x33, 0x30, 0x34, 0x30, 0x37, 0x37, 0x32, 0x32, 0x34, + 0x30, 0x32, 0x32, 0x32, 0x36, 0x31, 0x35, 0x30, 0x31, 0x7d + ]) + ); +}; + +export { getIgnoredUsersController }; diff --git a/src/controllers/api/getNewRewardSeedController.ts b/src/controllers/api/getNewRewardSeedController.ts new file mode 100644 index 000000000..a5c89069b --- /dev/null +++ b/src/controllers/api/getNewRewardSeedController.ts @@ -0,0 +1,7 @@ +import { RequestHandler } from "express"; + +const getNewRewardSeedController: RequestHandler = (_req, res) => { + res.sendStatus(200); +}; + +export { getNewRewardSeedController }; diff --git a/src/controllers/api/getShipController.ts b/src/controllers/api/getShipController.ts new file mode 100644 index 000000000..68328ee06 --- /dev/null +++ b/src/controllers/api/getShipController.ts @@ -0,0 +1,8 @@ +import { RequestHandler } from "express"; +import getShip from "@/static/fixed_responses/getShip.json"; + +const getShipController: RequestHandler = (_req, res) => { + res.json(getShip); +}; + +export { getShipController }; diff --git a/src/controllers/api/hostSessionController.ts b/src/controllers/api/hostSessionController.ts new file mode 100644 index 000000000..2ed60b60f --- /dev/null +++ b/src/controllers/api/hostSessionController.ts @@ -0,0 +1,6 @@ +import { RequestHandler } from "express"; +const hostSessionController: RequestHandler = (_req, res) => { + res.json({ sessionId: { $oid: "123123123" }, rewardSeed: 123123123123 }); +}; + +export { hostSessionController }; diff --git a/src/controllers/api/inboxController.ts b/src/controllers/api/inboxController.ts new file mode 100644 index 000000000..d5aa4f93a --- /dev/null +++ b/src/controllers/api/inboxController.ts @@ -0,0 +1,8 @@ +import { RequestHandler } from "express"; +import inbox from "@/static/fixed_responses/inbox.json"; + +const inboxController: RequestHandler = (_req, res) => { + res.json(inbox); +}; + +export { inboxController }; diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts new file mode 100644 index 000000000..fc6487175 --- /dev/null +++ b/src/controllers/api/inventoryController.ts @@ -0,0 +1,12 @@ +import { Request, Response, RequestHandler } from "express"; + +import inventory from "@/static/fixed_responses/inventory.json"; + +const inventorController: RequestHandler = (request: Request, response: Response) => { + console.log(request.query); + const accountId = request.query.accountId; + console.log(accountId); + response.json(inventory); +}; + +export default inventorController; diff --git a/src/controllers/api/loginController.ts b/src/controllers/api/loginController.ts new file mode 100644 index 000000000..822bfa918 --- /dev/null +++ b/src/controllers/api/loginController.ts @@ -0,0 +1,82 @@ +import { toLoginRequest } from "@/src/helpers/loginHelpers"; +import { Account } from "@/src/models/loginModel"; +import { createAccount, isCorrectPassword } from "@/src/services/loginService"; +import { ILoginResponse } from "@/src/types/loginTypes"; +import { DTLS, HUB, IRC, NRS, Nonce, groups, platformCDNs } from "@/static/fixed_responses/login_static"; +import { RequestHandler } from "express"; +import config from "../../../config.json"; + +// eslint-disable-next-line @typescript-eslint/no-misused-promises +const loginController: RequestHandler = async (request, response) => { + const body = JSON.parse(request.body); // parse octet stream of json data to json object + const loginRequest = toLoginRequest(body); + // console.log(body); + //console.log(String.fromCharCode.apiRouterly(null, req.body)); + + const account = await Account.findOne({ email: loginRequest.email }); //{ _id: 0, __v: 0 } + console.log("findone", account); + + if (!account && config.autoCreateAccount) { + try { + const newAccount = await createAccount({ + email: loginRequest.email, + password: loginRequest.password, + DisplayName: loginRequest.email.substring(0, loginRequest.email.indexOf("@")), + CountryCode: loginRequest.lang.toUpperCase(), + ClientType: loginRequest.ClientType, + CrossPlatformAllowed: true, + ForceLogoutVersion: 0, + ConsentNeeded: false, + TrackedSettings: [] + }); + console.log("CREATED ACCOUNT", newAccount); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { email, password, ...databaseAccount } = newAccount; + const newLoginResponse: ILoginResponse = { + ...databaseAccount, + Groups: groups, + platformCDNs: platformCDNs, + Nonce: Nonce, + NRS: NRS, + DTLS: DTLS, + IRC: IRC, + HUB: HUB, + BuildLabel: config.buildLabel, + MatchmakingBuildId: config.matchmakingBuildId + }; + + console.log(newLoginResponse); + response.json(newLoginResponse); + return; + } catch (error: unknown) { + if (error instanceof Error) { + throw new Error("error creating account"); + } + } + } + + //email not found or incorrect password + if (!account || !isCorrectPassword(loginRequest.password, account.password)) { + response.status(400).json({ error: "incorrect login data" }); + return; + } + + const { email, password, ...databaseAccount } = account.toJSON(); + const newLoginResponse: ILoginResponse = { + ...databaseAccount, + Groups: groups, + platformCDNs: platformCDNs, + Nonce: Nonce, + NRS: NRS, + DTLS: DTLS, + IRC: IRC, + HUB: HUB, + BuildLabel: config.buildLabel, + MatchmakingBuildId: config.matchmakingBuildId + }; + + console.log("login response", newLoginResponse); + response.json(newLoginResponse); +}; + +export { loginController }; diff --git a/src/controllers/api/loginRewardsController.ts b/src/controllers/api/loginRewardsController.ts new file mode 100644 index 000000000..2cd90af0e --- /dev/null +++ b/src/controllers/api/loginRewardsController.ts @@ -0,0 +1,8 @@ +import { RequestHandler } from "express"; +import loginRewards from "@/static/fixed_responses/loginRewards.json"; + +const loginRewardsController: RequestHandler = (_req, res) => { + res.json(loginRewards); +}; + +export { loginRewardsController }; diff --git a/src/controllers/api/marketRecommendationsController.ts b/src/controllers/api/marketRecommendationsController.ts new file mode 100644 index 000000000..478247963 --- /dev/null +++ b/src/controllers/api/marketRecommendationsController.ts @@ -0,0 +1,16 @@ +import { RequestHandler } from "express"; + +const marketRecommendationsController: RequestHandler = (_req, res) => { + const data = Buffer.from([ + 0x7b, 0x22, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x5b, + 0x5d, 0x2c, 0x22, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x22, 0x3a, 0x5b, 0x5d, 0x7d, 0x7d + ]); + res.writeHead(200, { + "Content-Type": "text/html", + "Content-Length": data.length + }); + res.end(data); +}; + +export { marketRecommendationsController }; diff --git a/src/controllers/api/marketSearchRecommendationsController.ts b/src/controllers/api/marketSearchRecommendationsController.ts new file mode 100644 index 000000000..992737b63 --- /dev/null +++ b/src/controllers/api/marketSearchRecommendationsController.ts @@ -0,0 +1,7 @@ +import { RequestHandler } from "express"; + +const marketSearchRecommendationsController: RequestHandler = (_req, res) => { + res.sendStatus(200); +}; + +export { marketSearchRecommendationsController }; diff --git a/src/controllers/api/purchaseController.ts b/src/controllers/api/purchaseController.ts new file mode 100644 index 000000000..f03933eb0 --- /dev/null +++ b/src/controllers/api/purchaseController.ts @@ -0,0 +1,6 @@ +import purchase from "@/static/fixed_responses/purchase.json"; +import { Request, Response } from "express"; + +export default (_req: Request, res: Response): void => { + res.json(purchase); +}; diff --git a/src/controllers/api/setActiveQuestController.ts b/src/controllers/api/setActiveQuestController.ts new file mode 100644 index 000000000..57e9e6318 --- /dev/null +++ b/src/controllers/api/setActiveQuestController.ts @@ -0,0 +1,7 @@ +import { RequestHandler } from "express"; + +const setActiveQuestController: RequestHandler = (_req, res) => { + res.sendStatus(200); +}; + +export { setActiveQuestController }; diff --git a/src/controllers/api/surveysController.ts b/src/controllers/api/surveysController.ts new file mode 100644 index 000000000..b69641be5 --- /dev/null +++ b/src/controllers/api/surveysController.ts @@ -0,0 +1,14 @@ +import { RequestHandler } from "express"; + +const surveysController: RequestHandler = (_req, res) => { + const data = Buffer.from([ + 0x7b, 0x22, 0x53, 0x75, 0x72, 0x76, 0x65, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d + ]); + res.writeHead(200, { + "Content-Type": "text/html", + "Content-Length": data.length + }); + res.end(data); +}; + +export { surveysController }; diff --git a/src/controllers/api/updateChallengeProgressController.ts b/src/controllers/api/updateChallengeProgressController.ts new file mode 100644 index 000000000..80c0ecf3c --- /dev/null +++ b/src/controllers/api/updateChallengeProgressController.ts @@ -0,0 +1,7 @@ +import { RequestHandler } from "express"; + +const updateChallengeProgressController: RequestHandler = (_request, response) => { + response.sendStatus(200); +}; + +export { updateChallengeProgressController }; diff --git a/src/controllers/api/viewController.ts b/src/controllers/api/viewController.ts new file mode 100644 index 000000000..fa0ea1a48 --- /dev/null +++ b/src/controllers/api/viewController.ts @@ -0,0 +1,8 @@ +import { RequestHandler } from "express"; +import view from "@/static/fixed_responses/view.json"; + +const viewController: RequestHandler = (_req, res) => { + res.json(view); +}; + +export { viewController }; diff --git a/src/controllers/custom/createAccountController.ts b/src/controllers/custom/createAccountController.ts new file mode 100644 index 000000000..09d8c90e6 --- /dev/null +++ b/src/controllers/custom/createAccountController.ts @@ -0,0 +1,14 @@ +/* eslint-disable @typescript-eslint/no-misused-promises */ +import { toDatabaseAccount, toCreateAccount } from "@/src/helpers/customHelpers"; +import { createAccount } from "@/src/services/loginService"; +import { RequestHandler } from "express"; + +const createAccountController: RequestHandler = async (req, res) => { + const createAccountData = toCreateAccount(req.body); + const databaseAccount = toDatabaseAccount(createAccountData); + + const account = await createAccount(databaseAccount); + res.json(account); +}; + +export { createAccountController }; diff --git a/src/controllers/dynamic/aggregateSessionsController.ts b/src/controllers/dynamic/aggregateSessionsController.ts new file mode 100644 index 000000000..1efbb9218 --- /dev/null +++ b/src/controllers/dynamic/aggregateSessionsController.ts @@ -0,0 +1,7 @@ +import { RequestHandler } from "express"; + +const aggregateSessionsController: RequestHandler = (_req, res) => { + res.json({}); +}; + +export { aggregateSessionsController }; diff --git a/src/controllers/dynamic/worldStateController.ts b/src/controllers/dynamic/worldStateController.ts new file mode 100644 index 000000000..d47571e0b --- /dev/null +++ b/src/controllers/dynamic/worldStateController.ts @@ -0,0 +1,8 @@ +import { RequestHandler } from "express"; +import worldState from "@/static/fixed_responses/worldState.json"; + +const worldStateController: RequestHandler = (_req, res) => { + res.json(worldState); +}; + +export { worldStateController }; diff --git a/src/controllers/misc/steamPacksController.ts b/src/controllers/misc/steamPacksController.ts new file mode 100644 index 000000000..f3f7d317a --- /dev/null +++ b/src/controllers/misc/steamPacksController.ts @@ -0,0 +1,6 @@ +import { RequestHandler } from "express"; + +const steamPacksController: RequestHandler = (_req, res) => { + res.sendStatus(200); +}; +export { steamPacksController }; diff --git a/src/helpers/customHelpers.ts b/src/helpers/customHelpers.ts new file mode 100644 index 000000000..351331fff --- /dev/null +++ b/src/helpers/customHelpers.ts @@ -0,0 +1,56 @@ +import { IAccountCreation } from "../types/customTypes"; +import { IDatabaseAccount } from "../types/loginTypes"; +import { isString, parseNumber, parseString, parseEmail } from "./general"; + +import crypto from "crypto"; + +const getWhirlpoolHash = (rawPassword: string): string => { + const whirlpool = crypto.createHash("whirlpool"); + const data = whirlpool.update(rawPassword, "utf8"); + const hash = data.digest("hex"); + return hash; +}; + +const parsePassword = (passwordCandidate: unknown): string => { + // a different function could be called that checks whether the password has a certain shape + if (!isString(passwordCandidate)) { + throw new Error("incorrect password format"); + } + return passwordCandidate; +}; + +const toAccountCreation = (accountCreation: unknown): IAccountCreation => { + if (!accountCreation || typeof accountCreation !== "object") { + throw new Error("incorrect or missing account creation data"); + } + + if ( + "email" in accountCreation && + "password" in accountCreation && + "DisplayName" in accountCreation && + "CountryCode" in accountCreation + ) { + const rawPassword = parsePassword(accountCreation.password); + console.log("email", accountCreation.email); + return { + email: parseEmail(accountCreation.email), + password: getWhirlpoolHash(rawPassword), + CountryCode: parseString(accountCreation.CountryCode), + DisplayName: parseString(accountCreation.DisplayName) + }; + } + throw new Error("incorrect account creation data: incorrect properties"); +}; + +const toDatabaseAccount = (createAccount: IAccountCreation): IDatabaseAccount => { + return { + ...createAccount, + ClientType: "", + ConsentNeeded: false, + CrossPlatformAllowed: true, + ForceLogoutVersion: 0, + TrackedSettings: [] + } satisfies IDatabaseAccount; +}; + +export { toDatabaseAccount, toAccountCreation as toCreateAccount }; diff --git a/src/helpers/general.ts b/src/helpers/general.ts new file mode 100644 index 000000000..21fbff1df --- /dev/null +++ b/src/helpers/general.ts @@ -0,0 +1,58 @@ +const isString = (text: unknown): text is string => { + return typeof text === "string" || text instanceof String; +}; + +const parseString = (data: unknown): string => { + if (!isString(data)) { + throw new Error("data is not a string"); + } + + return data; +}; + +const isNumber = (number: unknown): number is number => { + return typeof number === "number" && !isNaN(number); +}; + +const parseNumber = (data: unknown): number => { + if (!isNumber(data)) { + throw new Error("data is not a number"); + } + + return Number(data); +}; + +const isDate = (date: string) => { + if (!Date.parse(date)) { + throw new Error("invalid date"); + } + return date; +}; + +const parseDateNumber = (date: unknown): string => { + if (!isString(date) || !isDate(date)) { + throw new Error("date could not be parsed"); + } + + return date; +}; + +const parseEmail = (email: unknown): string => { + if (!isString(email)) { + throw new Error("incorrect email"); + } + return email; +}; + +const isBoolean = (booleanCandidate: unknown): booleanCandidate is boolean => { + return typeof booleanCandidate === "boolean"; +}; + +const parseBoolean = (booleanCandidate: unknown): boolean => { + if (!isBoolean(booleanCandidate)) { + throw new Error("argument was not a boolean"); + } + return booleanCandidate; +}; + +export { isString, isNumber, parseString, parseNumber, parseDateNumber, parseBoolean, parseEmail }; diff --git a/src/helpers/loginHelpers.ts b/src/helpers/loginHelpers.ts new file mode 100644 index 000000000..96712bfba --- /dev/null +++ b/src/helpers/loginHelpers.ts @@ -0,0 +1,35 @@ +import { ILoginRequest } from "../types/loginTypes"; +import { parseEmail, parseNumber, parseString } from "./general"; + +const toLoginRequest = (loginRequest: unknown): ILoginRequest => { + if (!loginRequest || typeof loginRequest !== "object") { + throw new Error("incorrect or missing login request data"); + } + + // TODO: function that checks whether every field of interface is in object + if ( + "email" in loginRequest && + "password" in loginRequest && + "time" in loginRequest && + "s" in loginRequest && + "lang" in loginRequest && + "date" in loginRequest && + "ClientType" in loginRequest && + "PS" in loginRequest + ) { + return { + email: parseEmail(loginRequest.email), + password: parseString(loginRequest.password), + time: parseNumber(loginRequest.time), + s: parseString(loginRequest.s), + lang: parseString(loginRequest.lang), + date: parseNumber(loginRequest.date), + ClientType: parseString(loginRequest.ClientType), + PS: parseString(loginRequest.PS) + }; + } + + throw new Error("incorrect login request"); +}; + +export { toLoginRequest }; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..b232bc1d5 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,19 @@ +import http from "http"; +import https from "https"; +import fs from "node:fs"; +import { app } from "./app"; +//const morgan = require("morgan"); +//const bodyParser = require("body-parser"); + +const options = { + key: fs.readFileSync("static/certs/key.pem"), + cert: fs.readFileSync("static/certs/cert.pem"), + passphrase: "123456" +}; + +// const server = http.createServer(app).listen(80); +http.createServer(app).listen(80, () => console.log("server started on port 80")); +const server = https.createServer(options, app).listen(443, () => console.log("server started on port 443")); + +// server.keepAliveTimeout = 60 * 1000 + 1000; +// server.headersTimeout = 60 * 1000 + 2000; diff --git a/src/middleware/middleware.ts b/src/middleware/middleware.ts new file mode 100644 index 000000000..fd69ce079 --- /dev/null +++ b/src/middleware/middleware.ts @@ -0,0 +1,16 @@ +import { Request, Response, NextFunction } from "express"; + +const unknownEndpointHandler = (request: Request, response: Response) => { + console.error("[ERROR] Unknown Endpoint", request.url); + response.status(404).json({ error: "endpoint was not found" }); +}; + +const requestLogger = (request: Request, _response: Response, next: NextFunction) => { + console.log("Method:", request.method); + console.log("Path: ", request.path); + console.log("Body: ", request.body); + console.log("---"); + next(); +}; + +export { unknownEndpointHandler, requestLogger }; diff --git a/src/models/loginModel.ts b/src/models/loginModel.ts new file mode 100644 index 000000000..0bcff0077 --- /dev/null +++ b/src/models/loginModel.ts @@ -0,0 +1,58 @@ +import mongoose, { model, Schema, SchemaOptions } from "mongoose"; +import { IDatabaseAccountDocument } from "../types/loginTypes"; +const opts = { + toJSON: { virtuals: true }, + toObject: { virtuals: true } +} satisfies SchemaOptions; + +// { +// toJSON: { virtuals: true } +// } +// { +// virtuals: { +// id: { +// get() { +// return "test"; +// } +// }, +// toJSON: { virtuals: true } +// } +// } + +const databaseAccountSchema = new Schema( + { + email: { type: String, required: true, unique: true }, + password: { type: String, required: true }, + DisplayName: { type: String, required: true }, + CountryCode: { type: String, required: true }, + ClientType: { type: String }, + CrossPlatformAllowed: { type: Boolean, required: true }, + ForceLogoutVersion: { type: Number, required: true }, + AmazonAuthToken: { type: String }, + AmazonRefreshToken: { type: String }, + ConsentNeeded: { type: Boolean, required: true }, + TrackedSettings: { type: [String], default: [] } + }, + opts +); + +databaseAccountSchema.set("toJSON", { + transform(_document, returnedObject) { + //returnedObject.id = returnedObject._id.toString(); + delete returnedObject._id; + delete returnedObject.__v; + }, + virtuals: true +}); + +//databaseAccountSchema.set(""); + +// Create a virtual property `domain` that's computed from `email`. +// databaseAccountSchema.virtual("id").get(function () { +// //console.log(this); +// return this._id; +// }); + +const Account = model("Account", databaseAccountSchema); + +export { Account }; diff --git a/src/models/t.ts b/src/models/t.ts new file mode 100644 index 000000000..882ff5aac --- /dev/null +++ b/src/models/t.ts @@ -0,0 +1,17 @@ +import mongoose from "mongoose"; + +const accountSchema = new mongoose.Schema({ + data: JSON +}); + +// personSchema.set("toJSON", { +// transform: (document, returnedObject:) => { +// returnedObject.id = returnedObject._id.toString(); +// delete returnedObject._id; +// delete returnedObject.__v; +// }, +// }); + +const Account = mongoose.model("account", accountSchema); + +export { Account }; diff --git a/src/routes/api.ts b/src/routes/api.ts new file mode 100644 index 000000000..3b7073a29 --- /dev/null +++ b/src/routes/api.ts @@ -0,0 +1,50 @@ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import express from "express"; + +import purchaseController from "@/src/controllers/api/purchaseController"; +import getFriendsController from "@/src/controllers/api/getFriendsController"; +import inventoryController from "@/src/controllers/api/inventoryController"; +import { marketRecommendationsController } from "../controllers/api/marketRecommendationsController"; +import { loginController } from "../controllers/api/loginController"; +import { surveysController } from "../controllers/api/surveysController"; +import { getIgnoredUsersController } from "../controllers/api/getIgnoredUsersController"; +import { dronesController } from "../controllers/api/dronesController"; +import { updateChallengeProgressController } from "../controllers/api/updateChallengeProgressController"; +import { findSessionsController } from "../controllers/api/findSessionsController"; +import { viewController } from "../controllers/api/viewController"; +import { getAllianceController } from "../controllers/api/getAllianceController"; +import { loginRewardsController } from "../controllers/api/loginRewardsController"; +import { checkDailyMissionBonusController } from "../controllers/api/checkDailyMissionBonusController"; +import { getShipController } from "../controllers/api/getShipController"; +import { inboxController } from "../controllers/api/inboxController"; +import { hostSessionController } from "../controllers/api/hostSessionController"; +import { getNewRewardSeedController } from "../controllers/api/getNewRewardSeedController"; +import { setActiveQuestController } from "../controllers/api/setActiveQuestController"; + +const apiRouter = express.Router(); + +// get +apiRouter.get("/inventory.php", inventoryController); +apiRouter.get("/getFriends.php", getFriendsController); +apiRouter.get("/marketRecommendations.php", marketRecommendationsController); +apiRouter.get("/marketSearchRecommendations.php", marketRecommendationsController); +apiRouter.get("/surveys.php", surveysController); +apiRouter.get("/loginRewards.php", loginRewardsController); +apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController); +apiRouter.get("/inbox.php", inboxController); +apiRouter.get("/getShip.php", getShipController); +apiRouter.get("/view.php", viewController); +apiRouter.get("/drones.php", dronesController); +apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController); +apiRouter.get("/getNewRewardSeed.php", getNewRewardSeedController); +apiRouter.get("/setActiveQuest.php", setActiveQuestController); + +// post +apiRouter.post("/findSessions.php", findSessionsController); +apiRouter.post("/purchase.php", purchaseController); +apiRouter.post("/login.php", loginController); +apiRouter.post("/getAlliance.php", getAllianceController); +apiRouter.post("/updateChallengeProgress.php", updateChallengeProgressController); +apiRouter.post("/hostSession.php", hostSessionController); + +export { apiRouter }; diff --git a/src/routes/cache.ts b/src/routes/cache.ts new file mode 100644 index 000000000..9848f61da --- /dev/null +++ b/src/routes/cache.ts @@ -0,0 +1,21 @@ +import express from "express"; + +const cacheRouter = express.Router(); + +cacheRouter.get("/B.Cache.Dx11.bin.*", (_req, res) => { + //console.log("asd", path.join(__dirname, "../data")); + res.sendFile("static/data/B.Cache.Dx11_33.0.6.bin", { root: "./" }); +}); + +cacheRouter.get("/B.Cache.Windows_en.bin*", (_req, res) => { + //console.log("asd", path.join(__dirname, "../data")); + res.sendFile("static/data/B.Cache.Windows_en_33.0.10.bin", { root: "./" }); +}); + +cacheRouter.get(/^\/origin\/([a-zA-Z0-9]+)\/H\.Cache\.bin.*$/, (_req, res) => { + // console.log("asd", path.join(__dirname, "../data")); + // console.log("asd", __dirname); + res.sendFile("static/data/H.Cache_33.0.10.bin", { root: "./" }); +}); + +export { cacheRouter }; diff --git a/src/routes/custom.ts b/src/routes/custom.ts new file mode 100644 index 000000000..ee36d6faf --- /dev/null +++ b/src/routes/custom.ts @@ -0,0 +1,8 @@ +import express from "express"; +import { createAccountController } from "../controllers/custom/createAccountController"; + +const customRouter = express.Router(); + +customRouter.post("/createAccount", createAccountController); + +export { customRouter }; diff --git a/src/routes/dynamic.ts b/src/routes/dynamic.ts new file mode 100644 index 000000000..3b6cd0c05 --- /dev/null +++ b/src/routes/dynamic.ts @@ -0,0 +1,10 @@ +import express from "express"; +import { worldStateController } from "../controllers/dynamic/worldStateController"; +import { aggregateSessionsController } from "../controllers/dynamic/aggregateSessionsController"; + +const dynamicController = express.Router(); + +dynamicController.get("/worldState.php", worldStateController); +dynamicController.get("/aggregateSessions.php", aggregateSessionsController); + +export { dynamicController }; diff --git a/src/services/loginService.ts b/src/services/loginService.ts new file mode 100644 index 000000000..90b8de977 --- /dev/null +++ b/src/services/loginService.ts @@ -0,0 +1,22 @@ +import { Account } from "../models/loginModel"; +import { IDatabaseAccount } from "../types/loginTypes"; + +const isCorrectPassword = (requestPassword: string, databasePassword: string): boolean => { + return requestPassword === databasePassword; +}; + +const createAccount = async (accountData: IDatabaseAccount) => { + console.log("test", accountData); + const account = new Account(accountData); + try { + await account.save(); + return account.toJSON(); + } catch (error) { + if (error instanceof Error) { + throw new Error(error.message); + } + throw new Error("error creating account that is not of instance Error"); + } +}; + +export { isCorrectPassword, createAccount }; diff --git a/src/services/mongoService.ts b/src/services/mongoService.ts new file mode 100644 index 000000000..6187d0b51 --- /dev/null +++ b/src/services/mongoService.ts @@ -0,0 +1,23 @@ +import * as dotenv from "dotenv"; +import mongoose from "mongoose"; + +dotenv.config(); + +const url = process.env.MONGODB_URL; + +if (!url) throw new Error("MONGODB_URL not found"); + +console.log("connecting to MongoDB URL:", url); + +const connectDatabase = async () => { + try { + await mongoose.connect(url); + console.log("connected to MongoDB"); + } catch (error: unknown) { + if (error instanceof Error) { + console.error("error connecting to MongoDB", error.message); + } + } +}; + +export { connectDatabase }; diff --git a/src/types/customTypes.ts b/src/types/customTypes.ts new file mode 100644 index 000000000..8ce0e6608 --- /dev/null +++ b/src/types/customTypes.ts @@ -0,0 +1,6 @@ +export interface IAccountCreation { + email: string; + password: string; + DisplayName: string; + CountryCode: string; +} diff --git a/src/types/loginTypes.ts b/src/types/loginTypes.ts new file mode 100644 index 000000000..4e9667497 --- /dev/null +++ b/src/types/loginTypes.ts @@ -0,0 +1,48 @@ +import { Document } from "mongoose"; + +export interface ILoginResponse extends Omit { + Groups: IGroup[]; + Nonce: number; + BuildLabel: string; + MatchmakingBuildId: string; + platformCDNs: string[]; + NRS: string[]; + DTLS: number; + IRC: string[]; + HUB: string; +} + +//includes virtual id +export interface IDatabaseAccountDocument extends IDatabaseAccount { + id: string; +} + +export interface IGroup { + experiment: string; + experimentGroup: string; +} + +export interface IDatabaseAccount { + email: string; + password: string; + DisplayName: string; + CountryCode: string; + ClientType: string; + CrossPlatformAllowed: boolean; + ForceLogoutVersion: number; + AmazonAuthToken?: string; + AmazonRefreshToken?: string; + ConsentNeeded: boolean; + TrackedSettings: string[]; +} + +export interface ILoginRequest { + email: string; + password: string; + time: number; + s: string; + lang: string; + date: number; + ClientType: string; + PS: string; +} diff --git a/static/certs/cert.pem b/static/certs/cert.pem new file mode 100644 index 000000000..1bb317116 --- /dev/null +++ b/static/certs/cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgIUTTlTpl18Pp7Dh6Da3EgLZuR7y5gwDQYJKoZIhvcNAQEL +BQAwazELMAkGA1UEBhMCREUxDDAKBgNVBAgMA05OTjEMMAoGA1UEBwwDTk5OMQ0w +CwYDVQQKDAROT05FMQ0wCwYDVQQLDAROT05FMQ0wCwYDVQQDDAROT05FMRMwEQYJ +KoZIhvcNAQkBFgROT05FMB4XDTIyMTIxNTE1MTQ0OFoXDTIzMTIxNTE1MTQ0OFow +azELMAkGA1UEBhMCREUxDDAKBgNVBAgMA05OTjEMMAoGA1UEBwwDTk5OMQ0wCwYD +VQQKDAROT05FMQ0wCwYDVQQLDAROT05FMQ0wCwYDVQQDDAROT05FMRMwEQYJKoZI +hvcNAQkBFgROT05FMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9Jkb +YfGil30uDb6qbsxlqBbebgCrpOBfa4V2vxRqjOzTW1DOy7B2GRP1G/YyKvEZmzP3 +8sjm0WAC/Xe2Fb44NsQmPnPbRfNhkajs/nLlHM7AmFlJX0vOL97BQBu60F/GOhNB +2xVDQpPMWADGX6NqdZ4a7V5rEp/1EmVNYtyycgxbmDQDDvs36busVTztMv2EzJSr +9WBSKDVCMFJsAUZUq97J+ejIUAfmfQQVnsJSVvLaxjLmkrpZppj/hUn+CrZCJUnw +KSAirYYvsbucjUpXuaMBoNxlNc3AVaLGmLphwsIJjVJ6ypU60vZZOCgZNXk/v+Cz +Zp+RgBIpRurSnB8mmh6x3fjgrWch4zmiLWVI8OfEc/69sf/RTgGk8ZIZXdNKAHVj +a61gfsqz17II5o20b/3qTezk4t8LQBb9k1lNdNrF1KsJLhFVR1rfQJ7LCoJ00+5F +bHztAOtAQswJZeIx5KoFqvUh3N8ycBMNcMKikYEdn4Te9KL8Svd/v77Iaz1KkMFD +8zTmg5vUTEn5/dE6V/nsNMcyLIiMn8e3EaLXvC1qAqcU+8TknrLK3XwyUTzYq07x +fOWj5g63TQ8Ypnoby2vQZfpNyDln69ltdIQzAG8ZfTIuULRgQruHVA+v+JyLnThz +QdeXTZF/GyzmWqE0HcshyAoMetDA8momloSN20ECAwEAAaNTMFEwHQYDVR0OBBYE +FKdA6ZD0RL1erdOO03xQ/zhBCb+1MB8GA1UdIwQYMBaAFKdA6ZD0RL1erdOO03xQ +/zhBCb+1MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBANoxXq+p +51ZD+NmLR6Kb8vdAtURQlxbeVohic1WPOIzSzb7rZ8Aamixnu/fCBYycfX8r3tf4 +3qB3rCtNCowHhPryQLblw8wPbhkoIIyRaaR6FXCRT3B29pg2XcJwc7w9eQZuTiRq +Ctfai1FJn4w2lRslIu+wKlS76JJyTnmK39aq3vBjE3HdquTzkqP8ZTf36ETwI88E +OqovePuqFVXSV6ZycHY5l/oAcJuQ0ytxc6EH0raLJTHFhOEeYLbWlNvjE6vg9tGC +yua9ifERyRwEplHNpVmZxMl+K1BmZhlTiPdxmtmuULgpOUTiwTeLGybwmbICk6i1 +g3MWammvwp/AuVqTHfl83JbgwW7mdPdnPGXZA8u8EaMbj0/Wcg1E9BpBZne+NYmc +7bSbTFARNCPN0/qvHZsp1aJTBlvTJ4nvrWlsny53fvmudEsgMYg1N+Qq7woc+svH +sucKpA8REg21uJNDRg701ungxKR0azDAiVSAPOmIGQ2KKqqY05bZCufo6dl5Jro7 +WzjKDdks2JMUjczaytX+Ys4zHyUYiahOm2dI01FU+Ybfu41GNQxSH9EYy1itqIpB +fqNGFL6YkzBi3mSg566UG/3Ew2B6fuFZdOU3VcBw4dV38tFbEkqZUxdOTwWd6a4b +andcuRgK1qhphfEqVeHrjPz66G9tm4gv+P1l +-----END CERTIFICATE----- diff --git a/static/certs/key.pem b/static/certs/key.pem new file mode 100644 index 000000000..bc2414116 --- /dev/null +++ b/static/certs/key.pem @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIJpDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIhPJDUgdojjcCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECBekTRM5Tk7lBIIJUNdO7a5uVPxQ +FZYNrfQskiENOviT0Yr1a0J2zagG4PEZ9bTsNmDDI1kU9nlnXlBRSuwT5+tTM3jp +hKgQQ5VG1FwlZmvMUWijtM99iz6YMGETQG+cpU4kBBwD+Qicym6kt2Loa57N7334 +0DJyyPlEpJ48nqkXTC6zNtdeohWhGFdFZcNep5loLBdyAFqjxc/HitrNUD0eWu8B +TkWaoZnaxS0aBlmCRCU+bWiVIRnrDjOB/YLKTSZWQMVaq9gSWyCso5rFkR2QOLKK +MrsIkiQ/I5Y/QwyS04pxf3/UBLgFHjH/zmnwuc/LXtCPoNXbe7K9fOMlFO2Z0ywE +Oo11fQ3ih0zisURJXQDfc9Y1BkKciISEVW9upuCw6sbsMAnnaS57k34V7ZbuxNnD +qq95k1rEpwIbyfYjYfGmwa7STfCCSY1dC7sXZ1M1VtLjCYg7oDQk2WAcHF5w6pyf +jTQCpgHizsnLOpkFRaS7qfHGqS7XFee0m95tPOI+PDQQ4D3knbhdrG1Gajly0enI +LJxsbdpfb+rVuhF/mj6pdUAwo646PgtZ1D/WrSmludO1uLOEbylmsN7xTROS3JZd +KNEihudApxceUAPlBbSVTds7+bzHvBoflLiomIFJW5MH0nw8ezAEHb18a0H+PorE +OrHKfSk7n2kzeKDtws7o1bN4s03AF87SY1xCildQNo6mOOYiJjTPXaUQ5iGmZKcF +PndYmE06QFAHPxE9jmRL5QdxBl3tS6Tz7aHO9DcGGMM3Jadb+drurjePPGszbPTp +gdgmpRgecF362ELveAnI4Nsz2EHX/pMvVo4Zil4JeVfKrh1WBpcE/sVVhMVnezm7 +DWqVCp2ngTGCs+Ti+J8kVfQtKmk1XEUtTnytrTRlJjrpLHby/w44r28mY2fQGzri +mFaDt79U/caA80PlUbYsmC0hvPQOhhprax8Hq4hPh61y1e8azXx49o1qJ84wp3uQ +R7kYz2JnNvPU3GbF7N7GCRGVnwX98WS8p4/BW0n33UGY5oiAX1q0QpjKMBxILwbD +13JfJg/B+DZHmhMkM4NXORzAB6e6rui+EsNg5T43KDM/D2XefHs2i3+MohnEb6Y6 +D8YA6tHCU4b+MHwCgM6U9r+6ec0/mma6pbGeuRcgPx7e8PiNCuCaN4D/8dNUnSIt +QN9JuC9EJc+PVi0TYOum69WXdt2tzNt4ylhAAHawmiu+3GeO+rzjviE1eTTM0z+8 +lrNuClWV+zUCPKJNt84/NWK1sTgkwIqesf5H4vnc5S4EslAlEV8W8K1QDXf2uF4g +dK+5FxExETZCMgZ27yTUR31BoJZCdvRUBSugGn4ygwRg5gswpRfHpafmVVZlnCEc +NDKdZBGepq93/HzHCaRCrl0+5eal9bq1ZTnqnBTrsBW6JNjt4Kgk4UkHLQxW0e8i +7+jN147QvVoJ0DCpEHvfIYnAhZGI+aO0+nmJbo1ccjLanuZL+r/arX0+BjLE1pbx +yYuKyXNT8O2cIMQ68nAtt8XmTYb+Sh6xLDHTn6QISh1o+Af5oO0AscbCXIZJpZ7V +b95X/EUygQhlEJaI+SqGgybBGAYNOP48MjJQQsGof4S6pmfkAf0LqUIT8y/6Y/DV +7ecS4gk2R2M8h1krhSA4ytefi7PRg91PJWJEXKxaV0V+LCfvEfnbAeQ+VLtutjSL +i4+lNT7H7kCxnuKMiVIah69B5lbP6cCV3WiXr0qhaaGUbxPGmhiQXqIZfun0BS3H +xXNbIJkgOOzw6HuWnyXr0AgwTlDmOFSnQkqelNEVhNsJaqWPUOxVZ+/bZ9lMK9Id +EY0MPPdF74hMrol4uSkLNwoM9CTwd/SVUprSy/74nUlvIje1dyh7+GR4C8pcsWNv +1zguqe8Cfc9EiiVY2rCl6xb4uxujOw6juWFuXkKrWrRbgGH3UTHk2khKAhUpg6/N +TmPBQkaGMFuJwN9b2Q3w6y6T5hHPowRM6SObjN06F2JixewcqAgN8oNTF1bAy6pu +AJ0Yr/ljPXitETYke3iEO/kgnv6ZtBUaK4TCFCTYZIDSot/IA3svGK4cr1yq+8mH +hAiHaxlzwbUJ2K75iCUdIKbK6U+55GUofZ5EvQWKnr4Or0TKdt1R58dYaY3Rrxhx +Opv3l/uQJNxF7SGW+N/S+2pMuP2uzDHfuIW+AQ3CWPM47ulPHSYRXzVqDdmwbkfK +VpNlRR1Fl2uaH3RyAGOau88fIh4eSGQytWAj/BW/A8uNeHQn/uo7XSFFGxX+i2VR +l55dKZOMlxMVo46/IuWvhZRKMEekCVjOFIn7AazQYblCTieI0jvBFRiy+aOiJtOt +duzgAN6AT+qAymkKaKUfXHjx04EpjmJ9LAkgfzWTLA+OGe35N/35+d3fZVwpJS5K +BOD0rCjmA5BD8ccrIiyCJYco/8Ee09POe8s7RjXIl4xoBAN2ekkcasdaKjJkKErv +VXoH75urasna9XcDq/sMSjnZpecM+L+kDH0+YATmQVnNP7PKd/xFU4PS/stxe/p/ +9c3HJ37HTvdbeBCCASC1jO52Kes6rgWRtpituh80YU2Um3YKahptRQdzJASveO45 +8YGWrBwQBDR/QAkPbgj1tGxBr8/9r4Lxjvy1mY7tJRZ5AJT0jIUDtW1U2n7ZaT0p +LK5rAQXD6ujrHZ63193f0TIaBKLA6p+5OgTA0Y4J1SmoTcDKQ33pIbAloQeop00p +HbyUB+V624NqnN0J49IuweB0Yy36P/dYP3WhhuN++ygpnvXn25G8eJwpwXSDAJU4 +JNAXDnPBBloeesppz03AYpKer3ZQ2rAea817/g61tcLg1wSINX8m0wlQ0e9SzzQw +GL1OyDvVHqdLW25pMCKRHTw1hYHVaCgvGgS+6AT4Ul384vygF6FLL/XxjN1Lu1Ei +jO4UnPriK1GmV79/t/vimSUHm/uGOyheLUHAS669TZdTxbQ/u9FYRQORhVf1CIis +GTXmCSeBHClXUYaeVaKO8H67EjMJI5NIKQU1PMUf0ZhvJY2M49sYhVMATjcMTpb8 +fR4uTayLYzNsBBB29mjl1cpikLQ9x/ZPL41YLbKuWMtMaqnFGu2d4q7MIlkrgxkd +8kzj1tU89VhbT56HOUm8SDdfPa3BNYZ9IzsVDYtWWAYS3Y5dJk/DmUFu9lnjxApY +iESTe1sS2ZzZRRYU7f1ftLRslVnuOY5i +-----END ENCRYPTED PRIVATE KEY----- diff --git a/static/data/.gitkeep b/static/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/static/fixed_responses/getShip.json b/static/fixed_responses/getShip.json new file mode 100644 index 000000000..f15c1be85 --- /dev/null +++ b/static/fixed_responses/getShip.json @@ -0,0 +1,24 @@ +{ + "ShipOwnerId": "removed", + "Ship": { + "Rooms": [ + { "Name": "AlchemyRoom", "MaxCapacity": 1600 }, + { "Name": "BridgeRoom", "MaxCapacity": 1600 }, + { "Name": "LisetRoom", "MaxCapacity": 1000 }, + { "Name": "OperatorChamberRoom", "MaxCapacity": 1600 }, + { "Name": "OutsideRoom", "MaxCapacity": 1600 }, + { "Name": "PersonalQuartersRoom", "MaxCapacity": 1600 } + ], + "ContentUrlSignature": "removed" + }, + "Apartment": { + "Rooms": [ + { "Name": "ElevatorLanding", "MaxCapacity": 1600 }, + { "Name": "ApartmentRoomA", "MaxCapacity": 1000 }, + { "Name": "ApartmentRoomB", "MaxCapacity": 1600 }, + { "Name": "ApartmentRoomC", "MaxCapacity": 1600 }, + { "Name": "DuviriHallway", "MaxCapacity": 1600 } + ], + "FavouriteLoadouts": [] + } +} diff --git a/static/fixed_responses/inbox.json b/static/fixed_responses/inbox.json new file mode 100644 index 000000000..a43fd2b1e --- /dev/null +++ b/static/fixed_responses/inbox.json @@ -0,0 +1,24 @@ +{ + "Inbox": [ + { + "sndr": "/Lotus/Language/Bosses/Ordis", + "msg": "/Lotus/Language/Inbox/ThankYouFreeMultipleContent", + "countedAtt": [ + { + "ItemType": "/Lotus/Upgrades/Skins/Promo/Twitch/OgrisTwitchSkin", + "ItemCount": 1 + }, + { + "ItemType": "/Lotus/Weapons/ClanTech/Chemical/RocketLauncher", + "ItemCount": 1 + } + ], + "sub": "/Lotus/Language/Inbox/ThankYouFreeMultipleSubject", + "icon": "/Lotus/Interface/Icons/Npcs/Ordis.png", + "highPriority": true, + "messageId": "removed", + "date": { "$date": { "$numberLong": "removed" } }, + "r": true + } + ] +} diff --git a/static/fixed_responses/inventory.json b/static/fixed_responses/inventory.json new file mode 100644 index 000000000..e19ac0908 --- /dev/null +++ b/static/fixed_responses/inventory.json @@ -0,0 +1,131 @@ +{ + "SubscribedToEmails": 0, + "Created": { "$date": { "$numberLong": "removed" } }, + "SubscribedToEmailsPersonalized": 0, + "RewardSeed": -123123123123123, + "CrewMemberBin": { "Slots": 3 }, + "CrewShipSalvageBin": { "Slots": 8 }, + "DrifterMelee": [ + { + "ItemType": "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords", + "ItemId": { "$oid": "removed" } + } + ], + "FusionPoints": 0, + "MechBin": { "Slots": 4 }, + "OperatorAmpBin": { "Slots": 8 }, + "PveBonusLoadoutBin": { "Slots": 0 }, + "PvpBonusLoadoutBin": { "Slots": 0 }, + "RandomModBin": { "Slots": 15 }, + "RegularCredits": 0, + "SentinelBin": { "Slots": 10 }, + "SpaceSuitBin": { "Slots": 4 }, + "SpaceWeaponBin": { "Slots": 4 }, + "SuitBin": { "Slots": 2 }, + "WeaponBin": { "Slots": 8 }, + "LastInventorySync": { "$oid": "removed" }, + "NextRefill": { "$date": { "$numberLong": "removed" } }, + "ActiveLandscapeTraps": [], + "ChallengeProgress": [], + "CrewMembers": [], + "CrewShips": [], + "CrewShipHarnesses": [], + "CrewShipSalvagedWeapons": [], + "CrewShipSalvagedWeaponSkins": [], + "CrewShipWeapons": [], + "CrewShipWeaponSkins": [], + "DataKnives": [], + "DrifterGuns": [], + "Drones": [], + "Horses": [], + "Hoverboards": [], + "KubrowPets": [], + "KubrowPetEggs": [], + "KubrowPetPrints": [], + "LongGuns": [], + "MechSuits": [], + "Melee": [], + "MoaPets": [], + "OperatorAmps": [], + "OperatorLoadOuts": [], + "AdultOperatorLoadOuts": [], + "KahlLoadOuts": [], + "PendingRecipes": [], + "PersonalGoalProgress": [], + "PersonalTechProjects": [], + "Pistols": [], + "QualifyingInvasions": [], + "RepVotes": [], + "Scoops": [], + "Sentinels": [], + "SentinelWeapons": [], + "Ships": [{ "ItemType": "/Lotus/Types/Items/Ships/DefaultShip", "ItemId": { "$oid": "123123" } }], + "SpaceGuns": [], + "SpaceMelee": [], + "SpaceSuits": [], + "SpecialItems": [], + "StepSequencers": [], + "Suits": [], + "Upgrades": [], + "WeaponSkins": [], + "Boosters": [], + "Consumables": [], + "EmailItems": [], + "FlavourItems": [], + "FocusUpgrades": [], + "FusionTreasures": [], + "LeagueTickets": [], + "LevelKeys": [], + "LoreFragmentScans": [], + "MiscItems": [], + "PendingSpectreLoadouts": [], + "Quests": [], + "QuestKeys": [], + "RawUpgrades": [], + "Recipes": [], + "Robotics": [], + "ShipDecorations": [], + "SpectreLoadouts": [], + "XPInfo": [], + "CrewShipAmmo": [], + "CrewShipRawSalvage": [], + "EvolutionProgress": [], + "Missions": [], + "TauntHistory": [], + "CompletedSyndicates": [], + "UsedDailyDeals": [], + "DailyAffiliation": 16000, + "DailyAffiliationPvp": 16000, + "DailyAffiliationLibrary": 16000, + "DailyAffiliationCetus": 16000, + "DailyAffiliationQuills": 16000, + "DailyAffiliationSolaris": 16000, + "DailyAffiliationVentkids": 16000, + "DailyAffiliationVox": 16000, + "DailyAffiliationEntrati": 16000, + "DailyAffiliationNecraloid": 16000, + "DailyAffiliationZariman": 16000, + "DailyAffiliationKahl": 16000, + "DailyFocus": 250000, + "GiftsRemaining": 8, + "LibraryAvailableDailyTaskInfo": { + "EnemyTypes": ["/Lotus/Types/Enemies/Orokin/OrokinBladeSawmanAvatar"], + "EnemyLocTag": "/Lotus/Language/Game/OrokinBladeSawman", + "EnemyIcon": "/Lotus/Interface/Icons/Npcs/Orokin/OrokinBladeSawman.png", + "ScansRequired": 4, + "RewardStoreItem": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/UncommonFusionBundle", + "RewardQuantity": 10, + "RewardStanding": 10000 + }, + "DuviriInfo": { "Seed": 123123123123123123, "NumCompletions": 0 }, + "TradesRemaining": 0, + "HasContributedToDojo": false, + "HasResetAccount": false, + "PendingCoupon": { + "Expiry": { "$date": { "$numberLong": "0" } }, + "Discount": 0 + }, + "PremiumCreditsFree": 0, + "ReceivedStartingGear": true, + "StoryModeChoice": "WARFRAME" +} diff --git a/static/fixed_responses/login.json b/static/fixed_responses/login.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/static/fixed_responses/login.json @@ -0,0 +1 @@ +{} diff --git a/static/fixed_responses/loginRewards.json b/static/fixed_responses/loginRewards.json new file mode 100644 index 000000000..b66325565 --- /dev/null +++ b/static/fixed_responses/loginRewards.json @@ -0,0 +1,9 @@ +{ + "DailyTributeInfo": { + "IsMilestoneDay": false, + "IsChooseRewardSet": true, + "LoginDays": 1337, + "NextMilestoneReward": "", + "NextMilestoneDay": 50 + } +} diff --git a/static/fixed_responses/login_static.ts b/static/fixed_responses/login_static.ts new file mode 100644 index 000000000..68a8ccbf2 --- /dev/null +++ b/static/fixed_responses/login_static.ts @@ -0,0 +1,33 @@ +import { IGroup } from "@/src/types/loginTypes"; + +export const groups: IGroup[] = [ + { + experiment: "InitiatePage", + experimentGroup: "initiate_page_no_video" + }, + { experiment: "ChatQAChannel", experimentGroup: "control" }, + { + experiment: "MarketSearchRecommendations", + experimentGroup: "premium_credit_purchases_14_days" + }, + { experiment: "SurveyLocation", experimentGroup: "EXIT" }, + { experiment: "GamesightAB", experimentGroup: "a" } +]; + +export const platformCDNs = [ + "https://content.warframe.com/", + "https://content-xb1.warframe.com/", + "https://content-ps4.warframe.com/", + "https://content-swi.warframe.com/", + "https://content-mob.warframe.com/" +]; + +export const Nonce = 1231231233; + +export const NRS = ["104.237.145.11", "139.144.69.73", "170.187.231.80", "45.33.58.33", "85.159.214.213"]; + +export const DTLS = 99; + +export const IRC = ["[2001:6e0:202:1026::6667]", "127.0.0.1"]; + +export const HUB = "https://arbiter.warframe.com/api/"; diff --git a/static/fixed_responses/purchase.json b/static/fixed_responses/purchase.json new file mode 100644 index 000000000..e9c277152 --- /dev/null +++ b/static/fixed_responses/purchase.json @@ -0,0 +1,13 @@ +{ + "InventoryChanges": { + "WeaponBin": { "count": 1, "platinum": 0, "Slots": -1 }, + "Suits": [ + { + "ItemType": "/Lotus/Powersuits/Ninja/Ninja", + "Configs": [], + "ItemId": { "$oid": "123123123123" } + } + ], + "RegularCredits": -25000 + } +} diff --git a/static/fixed_responses/upload.json b/static/fixed_responses/upload.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/static/fixed_responses/upload.json @@ -0,0 +1 @@ +{} diff --git a/static/fixed_responses/view.json b/static/fixed_responses/view.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/static/fixed_responses/view.json @@ -0,0 +1 @@ +{} diff --git a/static/fixed_responses/worldState.json b/static/fixed_responses/worldState.json new file mode 100644 index 000000000..c5481601c --- /dev/null +++ b/static/fixed_responses/worldState.json @@ -0,0 +1,2263 @@ +{ + "WorldSeed": "lybLxBivQnJ5vNFnKlYtDxIIcnp95rxLDKvolemz2MdTmgvcefIjvywh/nPPW1QxNxjl0lNQs870VfrE8h3wVjkERh5pjmCsLk/pb/q/I68i4BDe4D+F+Lhid1UTORzvMXE0yYjpfy169RMBTn/UfagKLaEUrm3mLFeQVP3vHlz5vstM/XEE9YL77o/FZzhXhgg+GVoxNoO1JlywvTxGol3MlofR16UNGwR+vaoZqu2cwhmM8kC2lPW1shbMnmM+d2db3wsFJTQoBI7PwiUo0sFzwpGrJfJhQGwp0yjF3mtbbLCK8ngLm82qyVBudRK8tOzMGVYnIMA5EKzm0B9Wzw==", + "Version": 10, + "MobileVersion": "4.15.13.1", + "BuildLabel": "2023.05.12.11.43/Er1Pres+jT2iCmIPRTdcDg", + "Time": 1684173953, + "Events": [ + { + "_id": { "$oid": "62d31b87106360aa5703954d" }, + "Messages": [ + { "LanguageCode": "en", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "fr", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "it", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "de", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "es", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "pt", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "ru", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "pl", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "uk", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "tr", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "ja", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "zh", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "ko", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" }, + { "LanguageCode": "tc", "Message": "/Lotus/Language/CommunityMessages/JoinDiscord" } + ], + "Prop": "https://discord.com/invite/playwarframe", + "Date": { "$date": { "$numberLong": "1658002200000" } }, + "Icon": "/Lotus/Interface/Icons/DiscordIconNoBacker.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "62dff6238607d6b5d80876f5" }, + "Messages": [{ "LanguageCode": "fr", "Message": "Une ressource indispensable, le Wiki FR Warframe !" }], + "Prop": "https://warframe.fandom.com/fr/wiki/Wiki_Warframe", + "Date": { "$date": { "$numberLong": "1658844600000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2022_07/image.png.f54c43d80f7da00887a7c41471884c84.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "62e4112cb40d7d395d0b880f" }, + "Messages": [{ "LanguageCode": "tr", "Message": "Warframe Türkiye Discord - Takas Odası Kanalları!" }], + "Prop": "https://forums.warframe.com/topic/1318162-warframe-t%C3%BCrkiye-discorduna-takas-kanallar%C4%B1-eklendi/", + "Date": { "$date": { "$numberLong": "1659113580000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2022_07/image.png.2515eac966b9f03c6eabf9b7e434d684.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "62ff8739293d0365d3046528" }, + "Messages": [{ "LanguageCode": "fr", "Message": "[Guide] Que faire après avoir terminé \"Le Trophée de Vor\"" }], + "Prop": "https://forums.warframe.com/topic/1315672-guide-que-faire-apr%C3%A8s-avoir-termin%C3%A9-le-troph%C3%A9e-de-vor/", + "Date": { "$date": { "$numberLong": "1660913400000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/0bd16bb52c55ec09ca1168becb87b030.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "6319fa5321a116ecd1017614" }, + "Messages": [{ "LanguageCode": "pl", "Message": "Aktualizacja 32: Veilbreaker - szczegóły po polsku" }], + "Prop": "https://forums.warframe.com/topic/1321154-aktualizacja-32-veilbreaker/", + "Date": { "$date": { "$numberLong": "1662646740000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/76a29b4bf3e094861c3d36ef31b34b3e.png", + "Priority": true, + "MobileOnly": false + }, + { + "_id": { "$oid": "633b073816cec9695a056a84" }, + "Messages": [{ "LanguageCode": "pl", "Message": "PRZEGLĄD DEVSTREAM 164" }], + "Prop": "https://forums.warframe.com/topic/1326595-przegl%C4%85d-devstream-164/", + "Date": { "$date": { "$numberLong": "1664812800000" } }, + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "63456893365cb9c9a309e104" }, + "Messages": [{ "LanguageCode": "pl", "Message": "Wprowadzenie do Polowania na Archona" }], + "Prop": "https://forums.warframe.com/topic/1327682-wprowadzenie-do-polowania-na-archona/", + "Date": { "$date": { "$numberLong": "1665493080000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/8c34580f18d0a489c282192bfc2a810b_1600x900.png", + "Priority": true, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "634d7f2f5c1c0e405d05254f" }, + "Messages": [{ "LanguageCode": "fr", "Message": "[Guide] Intro aux Chasses aux Archontes" }], + "Prop": "https://forums.warframe.com/topic/1328159-guide-introduction-aux-chasses-aux-archontes/", + "Date": { "$date": { "$numberLong": "1666023180000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/8c34580f18d0a489c282192bfc2a810b_1600x900.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "636a9e67315ccbc699001b5e" }, + "Messages": [{ "LanguageCode": "tr", "Message": "TennoGen Program Değişiklikleri - Elveda Son Tarihler!" }], + "Prop": "https://forums.warframe.com/topic/1330558-tennogen-program-de%C4%9Fi%C5%9Fiklikleri-elveda-son-tarihler/", + "Date": { "$date": { "$numberLong": "1667931660000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "63878183da0783f1c00ffc85" }, + "Messages": [{ "LanguageCode": "pl", "Message": "Aktualizacja 32.2: Żer na Lua - Notki po polsku!" }], + "Prop": "https://forums.warframe.com/topic/1332240-aktualizacja-322-%C5%BCer-na-lua/", + "Date": { "$date": { "$numberLong": "1669824840000" } }, + "Priority": true, + "MobileOnly": false + }, + { + "_id": { "$oid": "63a23acc1336bb81640a63dd" }, + "Messages": [], + "Prop": "", + "Date": { "$date": { "$numberLong": "1671576240000" } }, + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "63c84f910ee5a50a18071a24" }, + "Messages": [{ "LanguageCode": "tr", "Message": "Sentient Rehberi" }], + "Prop": "https://forums.warframe.com/topic/1337858-sentient-rehberi/", + "Date": { "$date": { "$numberLong": "1674071820000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "63e3f6c3cdc6622c2f039c19" }, + "Messages": [{ "LanguageCode": "tr", "Message": "Digital Extremes'ten Deprem Hakkında Bağış Çağrısı!" }], + "Prop": "https://forums.warframe.com/topic/1339442-digital-extremesten-deprem-hakk%C4%B1nda-mesaj-ve-ba%C4%9F%C4%B1%C5%9F-%C3%A7a%C4%9Fr%C4%B1s%C4%B1/", + "Date": { "$date": { "$numberLong": "1675883760000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2023_02/image.jpeg.623e13f76cc248d6b7947a59e35fca17.jpeg", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "6410c45efce307378e072f81" }, + "Messages": [{ "LanguageCode": "tr", "Message": "Devstream 168'e Genel Bakış" }], + "Prop": "https://forums.warframe.com/topic/1342430-devstream-168e-genel-bak%C4%B1%C5%9F/", + "Date": { "$date": { "$numberLong": "1678820280000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2023_03/image.png.2c5acaa71e1bab904c63b804aa3546df.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "64120cec5ca90487bf075d73" }, + "Messages": [ + { "LanguageCode": "en", "Message": "Hildryn Prime Access is now available!" }, + { "LanguageCode": "fr", "Message": "Le Prime Access Hildryn Prime est maintenant disponible !" }, + { "LanguageCode": "it", "Message": "L'Accesso Hildryn Prime è ora disponibile!" }, + { "LanguageCode": "de", "Message": "Hildryn Prime Access ist jetzt verfügbar!" }, + { "LanguageCode": "es", "Message": "¡Prime Access de Hildryn ya está disponible!" }, + { "LanguageCode": "pt", "Message": "O Prime Access da Hildryn Prime já está disponível!" }, + { "LanguageCode": "ru", "Message": "Доступ Хильдрин Прайм уже открыт!" }, + { "LanguageCode": "pl", "Message": "Hildryn Prime Access już dostępny!" }, + { "LanguageCode": "uk", "Message": "Гільдрина-прайм уже доступна!" }, + { "LanguageCode": "tr", "Message": "Hildryn Prime Access şimdi sizlerle!" }, + { "LanguageCode": "ja", "Message": "Hildryn Prime Accessが登場!" }, + { "LanguageCode": "zh", "Message": "Hildryn Prime Access 现已登场!" }, + { "LanguageCode": "ko", "Message": "힐드린 프라임 액세스를 지금 만나보세요!" }, + { "LanguageCode": "tc", "Message": "Hildryn Prime Access 現已登場!" } + ], + "Prop": "https://www.warframe.com/news/hildryn-prime-access?utm_medium=in-game&utm_source=in-game&utm_campaign=2023-03-HildrynPrimeAccessIGNLaunch", + "Date": { "$date": { "$numberLong": "1678904400000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/8260dab07e051d35bcef1a2a82c22965_1600x900.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "64134e23bf2682c23b0214ad" }, + "Messages": [{ "LanguageCode": "es", "Message": "Programas de terceros y tú" }], + "Prop": "https://forums.warframe.com/topic/1343097-programas-de-terceros-y-t%C3%BA/", + "Date": { "$date": { "$numberLong": "1678986720000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "64134e3ade1cddc4b002e087" }, + "Messages": [{ "LanguageCode": "es", "Message": "Disposición de mods agrietados marzo 2023" }], + "Prop": "https://forums.warframe.com/topic/1343219-disposici%C3%B3n-de-mods-agrietados-marzo-2023/", + "Date": { "$date": { "$numberLong": "1678986780000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "641b55c26c0201108c075e66" }, + "Messages": [ + { "LanguageCode": "en", "Message": "10 Year Anniversary Starts Now!" }, + { "LanguageCode": "fr", "Message": "Le 10e Anniversaire commence maintenant !" }, + { "LanguageCode": "it", "Message": "Il 10° Anniversario Inizia Ora!" }, + { "LanguageCode": "de", "Message": "Das 10. Jubiläum fängt jetzt an!" }, + { "LanguageCode": "es", "Message": "¡El 10º aniversario comienza ahora!" }, + { "LanguageCode": "pt", "Message": "O Aniversário de 10 anos começa agora!" }, + { "LanguageCode": "ru", "Message": "Праздник по поводу 10-летия Warframe начинается прямо сейчас!" }, + { "LanguageCode": "pl", "Message": "Dziesięciolecie zaczyna się teraz!" }, + { "LanguageCode": "uk", "Message": "10-та річниця Warframe розпочинається вже зараз!" }, + { "LanguageCode": "tr", "Message": "10. Yıl Dönümü Şimdi Başlıyor!" }, + { "LanguageCode": "ja", "Message": "10周年記念が今からスタート!" }, + { "LanguageCode": "zh", "Message": "十周年纪念现在开始!" }, + { "LanguageCode": "ko", "Message": "10주년 기념 행사가 지금부터 시작됩니다!" }, + { "LanguageCode": "tc", "Message": "10 週年紀念現在揭幕!" } + ], + "Prop": "https://www.warframe.com/anniversary?utm_medium=in-game&utm_source=in-game&utm_campaign=2023-03-10YearAnniversary", + "Date": { "$date": { "$numberLong": "1679511960000" } }, + "EventStartDate": { "$date": { "$numberLong": "1679509800000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/images/promo/anniversary/tenyears/masthead-keyart.jpg", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "642ca76911f9a53a5006bac6" }, + "Messages": [{ "LanguageCode": "fr", "Message": "Créez votre masque du Paradoxe Duviri !" }], + "Prop": "https://forums.warframe.com/topic/1344657-cr%C3%A9ez-votre-propre-masque-du-paradoxe-duviri/", + "Date": { "$date": { "$numberLong": "1680648000000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/c28ced01aaf966b9222f4a6ed5a7a7fd_1600x900.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "643810e2f1525ccbc601bc3e" }, + "Messages": [ + { "LanguageCode": "es", "Message": "Nueva configuración predeterminada para PC - Motor de gráficos mejorado" } + ], + "Prop": "https://forums.warframe.com/topic/1345129-anuncio-pr%C3%B3ximamente-con-duviri-nueva-configuraci%C3%B3n-predeterminada-para-pc-motor-de-gr%C3%A1ficos-mejorado/", + "Date": { "$date": { "$numberLong": "1681395840000" } }, + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "64416f9fe379cef063044700" }, + "Messages": [ + { "LanguageCode": "en", "Message": "Pre-order your official Duviri Merch today!" }, + { "LanguageCode": "fr", "Message": "Précommandez vos Produits Dérivés Duviri officiels dès aujourd'hui !" }, + { "LanguageCode": "it", "Message": "Preordina oggi stesso il Merch ufficiale Duviri!" }, + { "LanguageCode": "de", "Message": "Bestellt noch heute euren offiziellen Duviri-Merch vor!" }, + { "LanguageCode": "es", "Message": "¡Reserva los productos oficiales de Duviri hoy mismo!" }, + { "LanguageCode": "pt", "Message": "Faça a pré-encomenda dos Produtos oficiais de Duviri hoje mesmo!" }, + { "LanguageCode": "pl", "Message": "Już dziś zakup oficjalne Gadżety Duviri w przedsprzedaży!" }, + { "LanguageCode": "tr", "Message": "Resmi Duviri Ürünleri için bugün ön siparişini oluştur!" }, + { "LanguageCode": "ja", "Message": "デュヴィリ公式グッズを今すぐ予約注文しよう!" }, + { "LanguageCode": "zh", "Message": "立即预购你的官方双衍悖论周边商品!" }, + { "LanguageCode": "ko", "Message": "공식 두비리 굿즈를 지금 바로 예약 주문하세요!" }, + { "LanguageCode": "tc", "Message": "立即預購你的官方 Duviri 周邊商品!" } + ], + "Prop": "https://store.warframe.com/products/duviri-paradox-collection?utm_medium=in-game&utm_source=in-game&utm_campaign=2023-04-Merch-Duviri-Collection", + "Date": { "$date": { "$numberLong": "1682010000000" } }, + "EventStartDate": { "$date": { "$numberLong": "1682010000000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/99c3239af7f89d902feccdcfe3a47f72_1600x900.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "6444153668778753e30ed2d4" }, + "Messages": [{ "LanguageCode": "fr", "Message": "Duviri et au-delà, dernières infos" }], + "Prop": "https://forums.warframe.com/topic/1345726-duviri-et-au-del%C3%A0-derni%C3%A8res-infos/", + "Date": { "$date": { "$numberLong": "1682183340000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2023_04/FuVYV0aWcAAc60t.jpg.0e90f5d9af010ecaa5b9467aaf7333c3.jpg", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "64493dd93b9ce09dd509b136" }, + "Messages": [{ "LanguageCode": "ja", "Message": "「デュヴィリ・パラドックス」パッチノート" }], + "Prop": "https://bit.ly/3AxYiNW", + "Date": { "$date": { "$numberLong": "1682521440000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/0c1fb4674583e7e29bf36784b28f3476.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "64493fde2b02c323ce07ec73" }, + "Messages": [{ "LanguageCode": "pl", "Message": "Aktualizacja 33: Paradoks Duviri" }], + "Prop": "https://forums.warframe.com/topic/1345996-aktualizacja-33-paradoks-duviri/", + "Date": { "$date": { "$numberLong": "1682521920000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/0c1fb4674583e7e29bf36784b28f3476.png", + "Priority": true, + "MobileOnly": false + }, + { + "_id": { "$oid": "644941b97637518db60c1cfd" }, + "Messages": [ + { "LanguageCode": "en", "Message": "The Duviri Paradox is live now!" }, + { "LanguageCode": "fr", "Message": "Le Paradoxe Duviri est maintenant disponible !" }, + { "LanguageCode": "it", "Message": "Il Paradosso Duviri è ora disponibile!" }, + { "LanguageCode": "de", "Message": "Das Duviri-Paradox ist jetzt live!" }, + { "LanguageCode": "es", "Message": "¡«La Paradoja de Duviri» ya está disponible!" }, + { "LanguageCode": "pt", "Message": "O Paradoxo de Duviri já está disponível!" }, + { "LanguageCode": "ru", "Message": "Парадокс Дувири уже в игре!" }, + { "LanguageCode": "pl", "Message": "Paradoks Duviri jest już dostępny!" }, + { "LanguageCode": "uk", "Message": "«Парадокс Дувірі» уже в грі!" }, + { "LanguageCode": "tr", "Message": "Duviri Paradox şimdi sizlerle!" }, + { "LanguageCode": "ja", "Message": "「デュヴィリ・パラドックス」実装!" }, + { "LanguageCode": "zh", "Message": "《双衍悖论》现已登场!" }, + { "LanguageCode": "ko", "Message": "두비리의 역설을 지금 만나보세요!" }, + { "LanguageCode": "tc", "Message": "《Duviri 悖論》現已登場!" } + ], + "Prop": "", + "Links": [ + { "LanguageCode": "en", "Link": "https://www.warframe.com/the-duviri-paradox" }, + { "LanguageCode": "fr", "Link": "https://www.warframe.com/fr/the-duviri-paradox" }, + { "LanguageCode": "it", "Link": "https://www.warframe.com/it/the-duviri-paradox" }, + { "LanguageCode": "de", "Link": "https://www.warframe.com/de/the-duviri-paradox" }, + { "LanguageCode": "es", "Link": "https://www.warframe.com/es/the-duviri-paradox" }, + { "LanguageCode": "pt", "Link": "https://www.warframe.com/pt-br/the-duviri-paradox" }, + { "LanguageCode": "ru", "Link": "https://www.warframe.com/ru/the-duviri-paradox" }, + { "LanguageCode": "pl", "Link": "https://www.warframe.com/pl/the-duviri-paradox" }, + { "LanguageCode": "uk", "Link": "https://www.warframe.com/uk/the-duviri-paradox" }, + { "LanguageCode": "tr", "Link": "https://www.warframe.com/tr/the-duviri-paradox" }, + { "LanguageCode": "ja", "Link": "https://www.warframe.com/ja/the-duviri-paradox" }, + { "LanguageCode": "zh", "Link": "https://www.warframe.com/zh-hans/the-duviri-paradox" }, + { "LanguageCode": "ko", "Link": "https://www.warframe.com/ko/the-duviri-paradox" }, + { "LanguageCode": "tc", "Link": "https://www.warframe.com/zh-hant/the-duviri-paradox" } + ], + "Date": { "$date": { "$numberLong": "1682522460000" } }, + "EventStartDate": { "$date": { "$numberLong": "1682481600000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/3def735b82d131689e849afaa2f70b21_1600x900.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "64494dc72c44d78bab079685" }, + "Messages": [{ "LanguageCode": "ko", "Message": "업데이트 33: 두비리의 역설" }], + "Prop": "", + "Links": [ + { + "LanguageCode": "ko", + "Link": "https://forums.warframe.com/topic/1346037-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-33-%EB%91%90%EB%B9%84%EB%A6%AC%EC%9D%98-%EC%97%AD%EC%84%A4/" + } + ], + "Date": { "$date": { "$numberLong": "1682525580000" } }, + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "64495365aca4975f2408f5c3" }, + "Messages": [{ "LanguageCode": "es", "Message": "Actualización 33: La Paradoja de Duviri" }], + "Prop": "https://forums.warframe.com/topic/1346059-actualizaci%C3%B3n-33-la-paradoja-de-duviri/", + "Date": { "$date": { "$numberLong": "1682527020000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "645169129527611027084025" }, + "Messages": [{ "LanguageCode": "fr", "Message": "Résumé Devstream #170 - version FR" }], + "Prop": "https://forums.warframe.com/topic/1349991-r%C3%A9sum%C3%A9-devstream-170-version-fr/", + "Date": { "$date": { "$numberLong": "1683056880000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2023_05/image.png.af5b3f515b635eee36e965db0f6976a9.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "64517606c429f4f85d0f069d" }, + "Messages": [{ "LanguageCode": "ja", "Message": "Nora's Mix Vol. 3 終了日 + Nightwaveの今後について" }], + "Prop": "https://bit.ly/3AJu8HT", + "Date": { "$date": { "$numberLong": "1683060000000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2021_01/Wiki-background.thumb.jpg.f568775e1b4eab008c7c6d3802c942aa.jpg", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "64526ff9c2fc4425c207b3a2" }, + "Messages": [{ "LanguageCode": "fr", "Message": "Fin du Mix Vol. 3 ; le Vol. 4 arrive !" }], + "Prop": "https://forums.warframe.com/topic/1350279-le-mix-de-nora-vol-3-se-termine-bient%C3%B4t-le-vol-4-arrive/", + "Date": { "$date": { "$numberLong": "1683124140000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2023_05/image.png.6bfa5346e2d4b6e6c6d721edfb447c2f.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "6453f7bf20df842a150d8316" }, + "Messages": [{ "LanguageCode": "en", "Message": "Have your Dojo featured on the Star Chart!" }], + "Prop": "https://forums.warframe.com/topic/1349495-star-chart-dojo-showcase-spring-2023/?utm_medium=in-game&utm_source=in-game&utm_campaign=2023-05-Spring-dojo-contest", + "Date": { "$date": { "$numberLong": "1683224460000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "6453fc4380fb13ff9a072376" }, + "Messages": [ + { "LanguageCode": "en", "Message": "Now Available: Nova Prime and Trinity Prime" }, + { "LanguageCode": "fr", "Message": "Maintenant disponible : Nova Prime et Trinity Prime" }, + { "LanguageCode": "it", "Message": "Ora Disponibili: Nova Prime e Trinity Prime" }, + { "LanguageCode": "de", "Message": "Jetzt erhältlich: Nova Prime und Trinity Prime" }, + { "LanguageCode": "es", "Message": "Disponible ya: Nova Prime y Trinity Prime" }, + { "LanguageCode": "pt", "Message": "Já Disponível: Nova Prime e Trinity Prime" }, + { "LanguageCode": "ru", "Message": "Уже доступны: Нова Прайм и Тринити Прайм" }, + { "LanguageCode": "pl", "Message": "Już dostępne: Nova Prime i Trinity Prime" }, + { "LanguageCode": "uk", "Message": "Уже доступні: Нова-прайм і Трініті-прайм\t" }, + { "LanguageCode": "tr", "Message": "Şimdi Sizlerle: Nova Prime ve Trinity Prime" }, + { "LanguageCode": "ja", "Message": "Nova PrimeとTrinity Primeをゲットしよう" }, + { "LanguageCode": "zh", "Message": "现已登场:Nova Prime 和 Trinity Prime" }, + { "LanguageCode": "ko", "Message": "지금 바로 구매 가능: 노바 프라임 및 트리니티 프라임" }, + { "LanguageCode": "tc", "Message": "現已登場:Nova Prime 以及 Trinity Prime" } + ], + "Prop": "https://www.warframe.com/prime-resurgence?utm_medium=in-game&utm_source=in-game&utm_campaign=2023-05-PrimeResurgenceNovaTrinity-Launch", + "Date": { "$date": { "$numberLong": "1683222960000" } }, + "EventEndDate": { "$date": { "$numberLong": "1685937600000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/3dde851b071ff5295e58f24d68b43760_800x450.png", + "Priority": false, + "MobileOnly": false, + "HideEndDateModifier": true + }, + { + "_id": { "$oid": "6455631604ebccd4df03ec08" }, + "Messages": [{ "LanguageCode": "uk", "Message": "Весняна вітрина додзьо для зоряної мапи 2023" }], + "Prop": "https://forums.warframe.com/topic/1350991-%D0%B2%D0%B5%D1%81%D0%BD%D1%8F%D0%BD%D0%B0-%D0%B2%D1%96%D1%82%D1%80%D0%B8%D0%BD%D0%B0-%D0%B4%D0%BE%D0%B4%D0%B7%D1%8C%D0%BE-%D0%B4%D0%BB%D1%8F-%D0%B7%D0%BE%D1%80%D1%8F%D0%BD%D0%BE%D1%97-%D0%BC%D0%B0%D0%BF%D0%B8-2023/", + "Date": { "$date": { "$numberLong": "1683317460000" } }, + "Icon": "https://content.invisioncic.com/Mwarframe/monthly_2023_05/image.png.89f589194d03dbcf09090e2aefb92395.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "645914c555a3d1c8a90f27a1" }, + "Messages": [ + { "LanguageCode": "en", "Message": "TennoCon 2023 Digital Pack Coming Soon" }, + { "LanguageCode": "fr", "Message": "Le Pack Digital TennoCon 2023 sera bientôt disponible" }, + { "LanguageCode": "it", "Message": "Il Pacchetto Digitale TennoCon 2023 Sarà Presto Disponibile" }, + { "LanguageCode": "de", "Message": "TennoCon 2023 Digital Paket in Kürze erhältlich" }, + { "LanguageCode": "es", "Message": "El Paquete Digital de TennoCon 2023 estará disponible pronto" }, + { "LanguageCode": "pt", "Message": "O Pacote Digital da TennoCon 2023 estará disponível em breve" }, + { "LanguageCode": "ru", "Message": "Цифровой набор TennoCon-2023 будет доступен уже скоро" }, + { "LanguageCode": "pl", "Message": "Pakiet Cyfrowy TennoCon 2023 już wkrótce dostępny" }, + { "LanguageCode": "uk", "Message": "Цифровий набір «Теннокон 2023» уже незабаром" }, + { "LanguageCode": "tr", "Message": "TennoCon 2023 Dijital Paketi Çok Yakında Sizlerle" }, + { "LanguageCode": "ja", "Message": "TennoCon 2023 デジタルパックが近日発売" }, + { "LanguageCode": "zh", "Message": "TennoCon 2023 虚拟礼包即将推出" }, + { "LanguageCode": "ko", "Message": "텐노콘 2023 디지털 팩이 곧 찾아옵니다" }, + { "LanguageCode": "tc", "Message": "TennoCon 2023 數位組合包即將登場" } + ], + "Prop": "", + "Links": [ + { "LanguageCode": "en", "Link": "https://www.warframe.com/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "fr", "Link": "https://www.warframe.com/fr/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "it", "Link": "https://www.warframe.com/it/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "de", "Link": "https://www.warframe.com/de/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "es", "Link": "https://www.warframe.com/es/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "pt", "Link": "https://www.warframe.com/pt-br/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "ru", "Link": "https://www.warframe.com/ru/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "pl", "Link": "https://www.warframe.com/pl/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "uk", "Link": "https://www.warframe.com/uk/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "tr", "Link": "https://www.warframe.com/tr/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "ja", "Link": "https://www.warframe.com/ja/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "zh", "Link": "https://www.warframe.com/zh-hans/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "ko", "Link": "https://www.warframe.com/ko/news/tennocon-2023-digital-pack" }, + { "LanguageCode": "tc", "Link": "https://www.warframe.com/zh-hant/news/tennocon-2023-digital-pack" } + ], + "Date": { "$date": { "$numberLong": "1683558420000" } }, + "EventStartDate": { "$date": { "$numberLong": "1683518400000" } }, + "EventEndDate": { "$date": { "$numberLong": "1684382400000" } }, + "ImageUrl": "https://n9e5v4d8.ssl.hwcdn.net/uploads/thumbnails/6ac5ed1de8ece0b5e9c5672eb4f231b3_1600x900.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "64595aa2cbd58003ea00e0dd" }, + "Messages": [{ "LanguageCode": "en", "Message": "Twitch Drops: Community Stream Schedule May 8 - 12" }], + "Prop": "https://forums.warframe.com/topic/1351655-community-stream-schedule-may-8-12/?utm_medium=in-game&utm_source=in-game&utm_campaign=2023-05-Community-Streams-08", + "Date": { "$date": { "$numberLong": "1683577380000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "6459af12ea89737c990b456a" }, + "Messages": [{ "LanguageCode": "ja", "Message": "5月8日~5月12日の配信スケジュール" }], + "Prop": "https://bit.ly/3B4axCe", + "Date": { "$date": { "$numberLong": "1683599040000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2023_05/image.png.b5bd22b27289a60e6aefd8f824dfe6b2.png", + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "645a87eb7a833bed4b0ded30" }, + "Messages": [{ "LanguageCode": "es", "Message": "Twitch Drops: Programa de streams de la comunidad" }], + "Prop": "https://forums.warframe.com/topic/1351805-programa-de-streams-y-twitch-drops-8-12-de-mayo/", + "Date": { "$date": { "$numberLong": "1683654540000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "645aba021123b9854001c09b" }, + "Messages": [{ "LanguageCode": "uk", "Message": "Трансляції від спільноти: 8 — 12 травня" }], + "Prop": "https://forums.warframe.com/topic/1351841-%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%86%D1%96%D1%97-%D0%B2%D1%96%D0%B4-%D1%81%D0%BF%D1%96%D0%BB%D1%8C%D0%BD%D0%BE%D1%82%D0%B8-8-%E2%80%94-12-%D1%82%D1%80%D0%B0%D0%B2%D0%BD%D1%8F/", + "Date": { "$date": { "$numberLong": "1683667380000" } }, + "ImageUrl": "https://content.invisioncic.com/Mwarframe/monthly_2023_05/image.png.d7e641598ef5ced77dc92b2b81577f68.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "645be299a2a9aaa49c020673" }, + "Messages": [{ "LanguageCode": "uk", "Message": "Швидкі виправлення 33.0.7: «Парадокс Дувірі»" }], + "Prop": "https://forums.warframe.com/topic/1352038-%D1%88%D0%B2%D0%B8%D0%B4%D0%BA%D1%96-%D0%B2%D0%B8%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8F-3307-%C2%AB%D0%BF%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81-%D0%B4%D1%83%D0%B2%D1%96%D1%80%D1%96%C2%BB/", + "Date": { "$date": { "$numberLong": "1683743340000" } }, + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "645bfdff708b8985900bb193" }, + "Messages": [{ "LanguageCode": "uk", "Message": " «Вибірка Нори 3» скоро закінчиться " }], + "Prop": "https://forums.warframe.com/topic/1352061-%C2%AB%D0%B2%D0%B8%D0%B1%D1%96%D1%80%D0%BA%D0%B0-%D0%BD%D0%BE%D1%80%D0%B8-3%C2%BB-%D1%81%D0%BA%D0%BE%D1%80%D0%BE-%D0%B7%D0%B0%D0%BA%D1%96%D0%BD%D1%87%D0%B8%D1%82%D1%8C%D1%81%D1%8F-%D0%BD%D0%B5%D0%B7%D0%B0%D0%B1%D0%B0%D1%80%D0%BE%D0%BC-%D0%B2%D0%B8%D1%85%D1%96%D0%B4-%D1%87%D0%B5%D1%82%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%97-%D0%B2%D0%B8%D0%B1%D1%96%D1%80%D0%BA%D0%B8/", + "Date": { "$date": { "$numberLong": "1683750360000" } }, + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "645d327aebb8dc02800c82ec" }, + "Messages": [ + { "LanguageCode": "en", "Message": "Get the Prime Gaming Udyat Iridos Syandana" }, + { "LanguageCode": "fr", "Message": "Obtenez la Syandana Udyat Iridos Prime Gaming" }, + { "LanguageCode": "it", "Message": "Ottieni la Syandana Udyat Iridos di Prime Gaming" }, + { "LanguageCode": "de", "Message": "Holt euch das Prime Gaming Udyat Iridos Syandana" }, + { "LanguageCode": "es", "Message": "Obtén la syandana Udyat Iridos de Prime Gaming" }, + { "LanguageCode": "pt", "Message": "Obtenha a Syandana Udyat Iridos do Prime Gaming" }, + { "LanguageCode": "ru", "Message": "Get the Prime Gaming Udyat Iridos Syandana" }, + { "LanguageCode": "pl", "Message": "Zdobądź Syandanę Udyat Iridos w Prime Gaming" }, + { "LanguageCode": "uk", "Message": "Отримайте сяндану «Уд’ят „Іридій“» від Prime Gaming" }, + { "LanguageCode": "tr", "Message": "Prime Gaming Udyat Iridos Syandana'yı Al" }, + { "LanguageCode": "ja", "Message": "Prime Gaming Udyat Iridosシャンダナをゲットしよう" }, + { "LanguageCode": "zh", "Message": "Get the Prime Gaming Udyat Iridos Syandana" }, + { "LanguageCode": "ko", "Message": "Get the Prime Gaming Udyat Iridos Syandana" }, + { "LanguageCode": "tc", "Message": "Get the Prime Gaming Udyat Iridos Syandana" } + ], + "Prop": "https://www.warframe.com/news/prime-gaming-iridos-collection?utm_medium=in-game&utm_source=in-game&utm_campaign=2023-05-PrimeGamingDrop7", + "Date": { "$date": { "$numberLong": "1683829080000" } }, + "EventStartDate": { "$date": { "$numberLong": "1683828000000" } }, + "ImageUrl": "https://warframe-web-assets.nyc3.cdn.digitaloceanspaces.com/uploads/thumbnails/4d92a5321bdfa34e86f9083916337a87_1600x900.png", + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "645e51fde44ddb5995040df7" }, + "Messages": [{ "LanguageCode": "fr", "Message": "Notes de màj : 33.0.8 / .9" }], + "Prop": "https://forums.warframe.com/topic/1352405-le-paradoxe-duviri%C2%A0-correctifs-3308-09/", + "Date": { "$date": { "$numberLong": "1683902940000" } }, + "Priority": false, + "MobileOnly": false + }, + { + "_id": { "$oid": "645e5b05e67b5aa7ac07b79d" }, + "Messages": [{ "LanguageCode": "es", "Message": "La Paradoja de Duviri: Revisión 33.0.8 + 33.0.9" }], + "Prop": "https://forums.warframe.com/topic/1352413-la-paradoja-de-duviri-revisi%C3%B3n-3308-3309/", + "Date": { "$date": { "$numberLong": "1683905220000" } }, + "Priority": false, + "MobileOnly": false, + "Community": true + }, + { + "_id": { "$oid": "645e79fc5cf901cb7700f68b" }, + "Messages": [{ "LanguageCode": "en", "Message": "The Duviri Paradox: Hotfix 33.0.10" }], + "Prop": "https://www.warframe.com/updates/pc/33-0-10", + "Date": { "$date": { "$numberLong": "1683913140000" } }, + "Priority": true, + "MobileOnly": false + } + ], + "Goals": [ + { + "_id": { "$oid": "6453f35c2299f43a85014cb8" }, + "Activation": { "$date": { "$numberLong": "1683298800000" } }, + "Expiry": { "$date": { "$numberLong": "1684508340000" } }, + "Count": 0, + "Goal": 1, + "Success": 0, + "Personal": true, + "ClampNodeScores": true, + "Node": "EventNode25", + "MissionKeyName": "/Lotus/Types/Keys/TacAlertKeyAnniversary2022J", + "Desc": "/Lotus/Language/G1Quests/Anniversary2017MissionTitle", + "Icon": "/Lotus/Interface/Icons/Player/GlyphLotus10Anniversary.png", + "Tag": "Anniversary2022TacAlert", + "Reward": { "items": ["/Lotus/StoreItems/Upgrades/Skins/Rhino/RhinoDexSkin"] } + }, + { + "_id": { "$oid": "6453f3a865fd6eb46105d157" }, + "Activation": { "$date": { "$numberLong": "1683298800000" } }, + "Expiry": { "$date": { "$numberLong": "1684508340000" } }, + "Count": 0, + "Goal": 1, + "Success": 0, + "Personal": true, + "ClampNodeScores": true, + "Node": "EventNode34", + "MissionKeyName": "/Lotus/Types/Keys/TacAlertKeyAnniversary2017B", + "Desc": "/Lotus/Language/G1Quests/Anniversary2017MissionTitle", + "Icon": "/Lotus/Interface/Icons/Player/GlyphLotus10Anniversary.png", + "Tag": "Anniversary2018TacAlert", + "Reward": { "items": ["/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DexTheSecond/DexTheSecond"] } + } + ], + "Alerts": [], + "Sorties": [ + { + "_id": { "$oid": "6462537d7613cbe1463e34ca" }, + "Activation": { "$date": { "$numberLong": "1684166400000" } }, + "Expiry": { "$date": { "$numberLong": "1684252800000" } }, + "Reward": "/Lotus/Types/Game/MissionDecks/SortieRewards", + "Seed": 64562, + "Boss": "SORTIE_BOSS_HEK", + "ExtraDrops": [], + "Variants": [ + { + "missionType": "MT_LANDSCAPE", + "modifierType": "SORTIE_MODIFIER_BOW_ONLY", + "node": "SolNode228", + "tileset": "EidolonTileset" + }, + { + "missionType": "MT_SURVIVAL", + "modifierType": "SORTIE_MODIFIER_HAZARD_RADIATION", + "node": "SolNode301", + "tileset": "OrokinMoonTilesetGrineer" + }, + { + "missionType": "MT_MOBILE_DEFENSE", + "modifierType": "SORTIE_MODIFIER_ARMOR", + "node": "SolNode122", + "tileset": "GrineerOceanTileset" + } + ], + "Twitter": true + } + ], + "LiteSorties": [ + { + "_id": { "$oid": "6461727d2402888fd7350321" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Reward": "/Lotus/Types/Game/MissionDecks/ArchonSortieRewards", + "Seed": 69453, + "Boss": "SORTIE_BOSS_NIRA", + "Missions": [ + { "missionType": "MT_INTEL", "node": "SolNode126" }, + { "missionType": "MT_DEFENSE", "node": "SolNode121" }, + { "missionType": "MT_ASSASSINATION", "node": "SolNode53" } + ] + } + ], + "SyndicateMissions": [ + { + "_id": { "$oid": "646256c65517847257529973" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "ArbitersSyndicate", + "Seed": 64562, + "Nodes": ["SolNode224", "SolNode36", "SolNode126", "SolNode135", "SolNode177", "SolNode407", "SolNode212"] + }, + { + "_id": { "$oid": "646256c65517847257529974" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "CephalonSudaSyndicate", + "Seed": 70278, + "Nodes": ["SolNode113", "SolNode107", "SolNode216", "SolNode708", "SolNode153", "SolNode74", "SettlementNode15"] + }, + { + "_id": { "$oid": "646256c65517847257529975" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "NecraloidSyndicate", + "Seed": 20208, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529976" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "EventSyndicate", + "Seed": 74853, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529977" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "KahlSyndicate", + "Seed": 32560, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529978" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "NewLokaSyndicate", + "Seed": 57833, + "Nodes": ["SolNode225", "SolNode106", "SolNode85", "SolNode23", "SettlementNode14", "SolNode19", "SolNode100"] + }, + { + "_id": { "$oid": "646256c65517847257529979" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "QuillsSyndicate", + "Seed": 75817, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c6551784725752997a" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "PerrinSyndicate", + "Seed": 99444, + "Nodes": ["SolNode63", "SolNode61", "SolNode96", "SettlementNode3", "SolNode402", "SolNode172", "SolNode196"] + }, + { + "_id": { "$oid": "646256c6551784725752997d" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionIntermission2Syndicate", + "Seed": 23094, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c6551784725752997f" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionIntermission4Syndicate", + "Seed": 66927, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c6551784725752997b" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegion2Syndicate", + "Seed": 59404, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529980" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionIntermission5Syndicate", + "Seed": 7941, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529981" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionIntermission6Syndicate", + "Seed": 77324, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529982" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionIntermission7Syndicate", + "Seed": 9953, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529983" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionIntermissionSyndicate", + "Seed": 92556, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c6551784725752997c" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegion3Syndicate", + "Seed": 43114, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c6551784725752997e" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionIntermission3Syndicate", + "Seed": 15703, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529984" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RadioLegionSyndicate", + "Seed": 85936, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529985" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "RedVeilSyndicate", + "Seed": 13859, + "Nodes": ["SolNode130", "SolNode22", "SolNode15", "SettlementNode2", "SolNode14", "SolNode215", "SolNode173"] + }, + { + "_id": { "$oid": "646256c65517847257529986" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "VentKidsSyndicate", + "Seed": 4915, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529987" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "VoxSyndicate", + "Seed": 28721, + "Nodes": [] + }, + { + "_id": { "$oid": "646256c65517847257529988" }, + "Activation": { "$date": { "$numberLong": "1684166342004" } }, + "Expiry": { "$date": { "$numberLong": "1684252740000" } }, + "Tag": "SteelMeridianSyndicate", + "Seed": 57749, + "Nodes": ["SolNode2", "SolNode27", "SolNode204", "SolNode73", "SolNode167", "SolNode404", "SolNode17"] + }, + { + "_id": { "$oid": "64625db40000000000000002" }, + "Activation": { "$date": { "$numberLong": "1684168116829" } }, + "Expiry": { "$date": { "$numberLong": "1684177115703" } }, + "Tag": "EntratiSyndicate", + "Seed": 1342, + "Nodes": [], + "Jobs": [ + { + "jobType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosGrnSurvivorBounty", + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierATableBRewards", + "masteryReq": 0, + "minEnemyLevel": 5, + "maxEnemyLevel": 15, + "xpAmounts": [6, 6, 6] + }, + { + "jobType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosExcavateBounty", + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierCTableBRewards", + "masteryReq": 1, + "minEnemyLevel": 15, + "maxEnemyLevel": 25, + "xpAmounts": [12, 12, 12] + }, + { + "jobType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosEndlessExcavateBounty", + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierBTableARewards", + "masteryReq": 5, + "minEnemyLevel": 25, + "maxEnemyLevel": 30, + "endless": true, + "bonusXpMultiplier": 0.15000001, + "xpAmounts": [14, 14, 14] + }, + { + "jobType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosAssassinateBounty", + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierDTableBRewards", + "masteryReq": 2, + "minEnemyLevel": 30, + "maxEnemyLevel": 40, + "xpAmounts": [18, 18, 18, 27] + }, + { + "jobType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosKeyPiecesBounty", + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierETableARewards", + "masteryReq": 3, + "minEnemyLevel": 40, + "maxEnemyLevel": 60, + "xpAmounts": [20, 20, 20, 20, 39] + }, + { + "jobType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosCrpSurvivorBounty", + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierETableARewards", + "masteryReq": 10, + "minEnemyLevel": 100, + "maxEnemyLevel": 100, + "xpAmounts": [25, 25, 25, 25, 50] + }, + { + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/VaultBountyTierATableCRewards", + "masteryReq": 5, + "minEnemyLevel": 30, + "maxEnemyLevel": 40, + "xpAmounts": [2, 2, 2, 4], + "locationTag": "ChamberB", + "isVault": true + }, + { + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/VaultBountyTierBTableCRewards", + "masteryReq": 5, + "minEnemyLevel": 40, + "maxEnemyLevel": 50, + "xpAmounts": [4, 4, 4, 5], + "locationTag": "ChamberA", + "isVault": true + }, + { + "rewards": "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/VaultBountyTierCTableCRewards", + "masteryReq": 5, + "minEnemyLevel": 50, + "maxEnemyLevel": 60, + "xpAmounts": [5, 5, 5, 7], + "locationTag": "ChamberC", + "isVault": true + } + ] + }, + { + "_id": { "$oid": "64625db40000000000000007" }, + "Activation": { "$date": { "$numberLong": "1684168116829" } }, + "Expiry": { "$date": { "$numberLong": "1684177115703" } }, + "Tag": "CetusSyndicate", + "Seed": 1342, + "Nodes": [], + "Jobs": [ + { + "jobType": "/Lotus/Types/Gameplay/Eidolon/Jobs/CaptureBountyCapOne", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/TierATableBRewards", + "masteryReq": 0, + "minEnemyLevel": 5, + "maxEnemyLevel": 15, + "xpAmounts": [380, 380, 380] + }, + { + "jobType": "/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountyLib", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/TierBTableBRewards", + "masteryReq": 1, + "minEnemyLevel": 10, + "maxEnemyLevel": 30, + "xpAmounts": [690, 690, 690] + }, + { + "jobType": "/Lotus/Types/Gameplay/Eidolon/Jobs/CaptureBountyCapTwo", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/TierCTableBRewards", + "masteryReq": 2, + "minEnemyLevel": 20, + "maxEnemyLevel": 40, + "xpAmounts": [670, 670, 670, 990] + }, + { + "jobType": "/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyCache", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/TierDTableBRewards", + "masteryReq": 3, + "minEnemyLevel": 30, + "maxEnemyLevel": 50, + "xpAmounts": [580, 580, 580, 580, 1140] + }, + { + "jobType": "/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyTheft", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/TierETableBRewards", + "masteryReq": 5, + "minEnemyLevel": 40, + "maxEnemyLevel": 60, + "xpAmounts": [740, 740, 740, 740, 1460] + }, + { + "jobType": "/Lotus/Types/Gameplay/Eidolon/Jobs/SabotageBountySab", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/TierETableBRewards", + "masteryReq": 10, + "minEnemyLevel": 100, + "maxEnemyLevel": 100, + "xpAmounts": [840, 840, 840, 840, 1660] + }, + { + "jobType": "/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/AssassinateBountyAss", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/NarmerTableBRewards", + "masteryReq": 0, + "minEnemyLevel": 50, + "maxEnemyLevel": 70, + "xpAmounts": [790, 790, 790, 790, 1550] + } + ] + }, + { + "_id": { "$oid": "64625db40000000000000021" }, + "Activation": { "$date": { "$numberLong": "1684168116829" } }, + "Expiry": { "$date": { "$numberLong": "1684177115703" } }, + "Tag": "SolarisSyndicate", + "Seed": 1342, + "Nodes": [], + "Jobs": [ + { + "jobType": "/Lotus/Types/Gameplay/Venus/Jobs/VenusChaosJobAssassinate", + "rewards": "/Lotus/Types/Game/MissionDecks/VenusJobMissionRewards/VenusTierATableBRewards", + "masteryReq": 0, + "minEnemyLevel": 5, + "maxEnemyLevel": 15, + "xpAmounts": [450, 450, 450] + }, + { + "jobType": "/Lotus/Types/Gameplay/Venus/Jobs/VenusWetworkJobSpy", + "rewards": "/Lotus/Types/Game/MissionDecks/VenusJobMissionRewards/VenusTierBTableBRewards", + "masteryReq": 1, + "minEnemyLevel": 10, + "maxEnemyLevel": 30, + "xpAmounts": [710, 710, 710] + }, + { + "jobType": "/Lotus/Types/Gameplay/Venus/Jobs/VenusHelpingJobCaches", + "rewards": "/Lotus/Types/Game/MissionDecks/VenusJobMissionRewards/VenusTierCTableBRewards", + "masteryReq": 2, + "minEnemyLevel": 20, + "maxEnemyLevel": 40, + "xpAmounts": [650, 650, 650, 960] + }, + { + "jobType": "/Lotus/Types/Gameplay/Venus/Jobs/VenusTheftJobExcavation", + "rewards": "/Lotus/Types/Game/MissionDecks/VenusJobMissionRewards/VenusTierDTableBRewards", + "masteryReq": 3, + "minEnemyLevel": 30, + "maxEnemyLevel": 50, + "xpAmounts": [570, 570, 570, 570, 1120] + }, + { + "jobType": "/Lotus/Types/Gameplay/Venus/Jobs/VenusPreservationJobResource", + "rewards": "/Lotus/Types/Game/MissionDecks/VenusJobMissionRewards/VenusTierETableBRewards", + "masteryReq": 5, + "minEnemyLevel": 40, + "maxEnemyLevel": 60, + "xpAmounts": [720, 720, 720, 720, 1420] + }, + { + "jobType": "/Lotus/Types/Gameplay/Venus/Jobs/VenusCullJobExterminate", + "rewards": "/Lotus/Types/Game/MissionDecks/VenusJobMissionRewards/VenusTierETableBRewards", + "masteryReq": 10, + "minEnemyLevel": 100, + "maxEnemyLevel": 100, + "xpAmounts": [840, 840, 840, 840, 1660] + }, + { + "jobType": "/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusCullJobAssassinate", + "rewards": "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/NarmerTableBRewards", + "masteryReq": 0, + "minEnemyLevel": 50, + "maxEnemyLevel": 70, + "xpAmounts": [800, 800, 800, 800, 1570] + } + ] + }, + { + "_id": { "$oid": "64625db40000000000000025" }, + "Activation": { "$date": { "$numberLong": "1684168116829" } }, + "Expiry": { "$date": { "$numberLong": "1684177115703" } }, + "Tag": "ZarimanSyndicate", + "Seed": 1342, + "Nodes": [] + } + ], + "ActiveMissions": [ + { + "_id": { "$oid": "64626499487c49ad81bf65a7" }, + "Region": 19, + "Seed": 84961, + "Activation": { "$date": { "$numberLong": "1684169881425" } }, + "Expiry": { "$date": { "$numberLong": "1684176349746" } }, + "Node": "SolNode743", + "MissionType": "MT_MOBILE_DEFENSE", + "Modifier": "VoidT5" + }, + { + "_id": { "$oid": "64626499487c49ad81bf65a8" }, + "Region": 19, + "Seed": 79916, + "Activation": { "$date": { "$numberLong": "1684169881425" } }, + "Expiry": { "$date": { "$numberLong": "1684174188106" } }, + "Node": "SolNode745", + "MissionType": "MT_ARTIFACT", + "Modifier": "VoidT5" + }, + { + "_id": { "$oid": "64626499487c49ad81bf65a9" }, + "Region": 19, + "Seed": 21862, + "Activation": { "$date": { "$numberLong": "1684169881425" } }, + "Expiry": { "$date": { "$numberLong": "1684176133258" } }, + "Node": "SolNode741", + "MissionType": "MT_ASSAULT", + "Modifier": "VoidT5" + }, + { + "_id": { "$oid": "6462698599eb460033331eb5" }, + "Region": 9, + "Seed": 37915, + "Activation": { "$date": { "$numberLong": "1684171141913" } }, + "Expiry": { "$date": { "$numberLong": "1684178172688" } }, + "Node": "SolNode56", + "MissionType": "MT_SABOTAGE", + "Modifier": "VoidT4" + }, + { + "_id": { "$oid": "6462698599eb460033331eb6" }, + "Region": 12, + "Seed": 71738, + "Activation": { "$date": { "$numberLong": "1684171141913" } }, + "Expiry": { "$date": { "$numberLong": "1684178224146" } }, + "Node": "SolNode177", + "MissionType": "MT_ARTIFACT", + "Modifier": "VoidT4" + }, + { + "_id": { "$oid": "64626a75860d8a695596e882" }, + "Region": 16, + "Seed": 82578, + "Activation": { "$date": { "$numberLong": "1684171381174" } }, + "Expiry": { "$date": { "$numberLong": "1684178111718" } }, + "Node": "SettlementNode3", + "MissionType": "MT_SURVIVAL", + "Modifier": "VoidT2" + }, + { + "_id": { "$oid": "64626ab1b92222873a06dd8d" }, + "Region": 10, + "Seed": 43676, + "Activation": { "$date": { "$numberLong": "1684171441346" } }, + "Expiry": { "$date": { "$numberLong": "1684178603970" } }, + "Node": "SolNode140", + "MissionType": "MT_MOBILE_DEFENSE", + "Modifier": "VoidT2", + "Hard": true + }, + { + "_id": { "$oid": "64626ab1b92222873a06dd8e" }, + "Region": 6, + "Seed": 30587, + "Activation": { "$date": { "$numberLong": "1684171441346" } }, + "Expiry": { "$date": { "$numberLong": "1684175745872" } }, + "Node": "SolNode31", + "MissionType": "MT_RESCUE", + "Modifier": "VoidT2", + "Hard": true + }, + { + "_id": { "$oid": "64626e365fe8c70d0a5550dc" }, + "Region": 7, + "Seed": 20823, + "Activation": { "$date": { "$numberLong": "1684172342105" } }, + "Expiry": { "$date": { "$numberLong": "1684178830943" } }, + "Node": "SolNode64", + "MissionType": "MT_TERRITORY", + "Modifier": "VoidT3", + "Hard": true + }, + { + "_id": { "$oid": "64626e365fe8c70d0a5550dd" }, + "Region": 13, + "Seed": 87157, + "Activation": { "$date": { "$numberLong": "1684172342105" } }, + "Expiry": { "$date": { "$numberLong": "1684177783366" } }, + "Node": "SolNode217", + "MissionType": "MT_RESCUE", + "Modifier": "VoidT3", + "Hard": true + }, + { + "_id": { "$oid": "64626fd99040eb8627dc8b1b" }, + "Region": 2, + "Seed": 72372, + "Activation": { "$date": { "$numberLong": "1684172761694" } }, + "Expiry": { "$date": { "$numberLong": "1684176820429" } }, + "Node": "SolNode23", + "MissionType": "MT_TERRITORY", + "Modifier": "VoidT1", + "Hard": true + }, + { + "_id": { "$oid": "64626fd99040eb8627dc8b1c" }, + "Region": 3, + "Seed": 848, + "Activation": { "$date": { "$numberLong": "1684172761694" } }, + "Expiry": { "$date": { "$numberLong": "1684177551793" } }, + "Node": "SolNode79", + "MissionType": "MT_INTEL", + "Modifier": "VoidT1", + "Hard": true + }, + { + "_id": { "$oid": "6462717d9a17bf4b58f42da1" }, + "Region": 9, + "Seed": 83346, + "Activation": { "$date": { "$numberLong": "1684173181847" } }, + "Expiry": { "$date": { "$numberLong": "1684177162835" } }, + "Node": "SolNode38", + "MissionType": "MT_MOBILE_DEFENSE", + "Modifier": "VoidT4", + "Hard": true + }, + { + "_id": { "$oid": "6462717d9a17bf4b58f42da2" }, + "Region": 11, + "Seed": 23791, + "Activation": { "$date": { "$numberLong": "1684173181847" } }, + "Expiry": { "$date": { "$numberLong": "1684178236276" } }, + "Node": "SolNode166", + "MissionType": "MT_SURVIVAL", + "Modifier": "VoidT4", + "Hard": true + }, + { + "_id": { "$oid": "6462726d531041a658636c7e" }, + "Region": 2, + "Seed": 110, + "Activation": { "$date": { "$numberLong": "1684173421795" } }, + "Expiry": { "$date": { "$numberLong": "1684177464571" } }, + "Node": "SolNode61", + "MissionType": "MT_SABOTAGE", + "Modifier": "VoidT1" + }, + { + "_id": { "$oid": "6462726d531041a658636c7f" }, + "Region": 4, + "Seed": 57014, + "Activation": { "$date": { "$numberLong": "1684173421795" } }, + "Expiry": { "$date": { "$numberLong": "1684180480504" } }, + "Node": "SolNode68", + "MissionType": "MT_MOBILE_DEFENSE", + "Modifier": "VoidT1" + }, + { + "_id": { "$oid": "6462726d531041a658636c80" }, + "Region": 3, + "Seed": 69063, + "Activation": { "$date": { "$numberLong": "1684173421795" } }, + "Expiry": { "$date": { "$numberLong": "1684180091866" } }, + "Node": "SolNode89", + "MissionType": "MT_EXTERMINATION", + "Modifier": "VoidT1" + }, + { + "_id": { "$oid": "646272aa88e6aa74be6fbfd8" }, + "Region": 13, + "Seed": 65267, + "Activation": { "$date": { "$numberLong": "1684173481988" } }, + "Expiry": { "$date": { "$numberLong": "1684179209996" } }, + "Node": "SolNode220", + "MissionType": "MT_SABOTAGE", + "Modifier": "VoidT3" + }, + { + "_id": { "$oid": "646272aa88e6aa74be6fbfd9" }, + "Region": 15, + "Seed": 98268, + "Activation": { "$date": { "$numberLong": "1684173481988" } }, + "Expiry": { "$date": { "$numberLong": "1684179339619" } }, + "Node": "SolNode412", + "MissionType": "MT_TERRITORY", + "Modifier": "VoidT3" + }, + { + "_id": { "$oid": "6462735d595b1fd6980f12b9" }, + "Region": 19, + "Seed": 41368, + "Activation": { "$date": { "$numberLong": "1684173661308" } }, + "Expiry": { "$date": { "$numberLong": "1684178998950" } }, + "Node": "SolNode746", + "MissionType": "MT_EXTERMINATION", + "Modifier": "VoidT5", + "Hard": true + } + ], + "GlobalUpgrades": [], + "FlashSales": [ + { + "TypeName": "/Lotus/Types/StoreItems/Packages/AOTZSupporterPackA", + "StartDate": { "$date": { "$numberLong": "1654560000000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": false, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": true, + "VoidEclipse": false, + "BannerIndex": 999, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 1, + "BogoBuy": 0, + "BogoGet": 0 + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/AOTZSupporterPackB", + "StartDate": { "$date": { "$numberLong": "1661173200000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": false, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": true, + "VoidEclipse": false, + "BannerIndex": 999, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 1, + "BogoBuy": 0, + "BogoGet": 0 + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/VeilbreakerSupporterPack", + "StartDate": { "$date": { "$numberLong": "1662422400000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": false, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": true, + "VoidEclipse": false, + "BannerIndex": 999, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 1, + "BogoBuy": 0, + "BogoGet": 0 + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/InitiateIIIPCPack", + "StartDate": { "$date": { "$numberLong": "1667347200000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": true, + "Popular": false, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": true, + "VoidEclipse": false, + "BannerIndex": 5, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 1, + "BogoBuy": 0, + "BogoGet": 0 + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/DeluxeBundles/TitaniaDeluxeIISkinBundle", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 80, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 195, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/DeluxeBundles/XakuLotusDeluxeSkinBundle", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 85, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 430, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/VorunaVoidshellSkinBundle", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 90, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 90, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/DeluxeBundles/MesaVoltDeluxeSkinBundle", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 95, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 260, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/Items/MiscItems/OrokinCatalyst", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 105, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 20, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Powersuits/Werewolf/Werewolf", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 100, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 325, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/FormaPack", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 110, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 35, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Upgrades/Skins/Effects/NarmerEvolvingEphemeraA", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 115, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 80, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Upgrades/Skins/Saryn/SarynLunarNewYearSkin", + "StartDate": { "$date": { "$numberLong": "1675036800000" } }, + "EndDate": { "$date": { "$numberLong": "1703980800000" } }, + "Featured": false, + "Popular": true, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 120, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 165, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/PrimeAccess1Tier3StoreItem", + "StartDate": { "$date": { "$numberLong": "1678838400000" } }, + "EndDate": { "$date": { "$numberLong": "1693494000000" } }, + "Featured": false, + "Popular": false, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 1, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 1, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/PrimeAccess1AccessoryStoreItem", + "StartDate": { "$date": { "$numberLong": "1678838400000" } }, + "EndDate": { "$date": { "$numberLong": "1693440000000" } }, + "Featured": false, + "Popular": false, + "ShowInMarket": true, + "HideFromMarket": false, + "ShowWithRecommended": true, + "SupporterPack": false, + "VoidEclipse": false, + "BannerIndex": 2, + "Discount": 0, + "RegularOverride": 0, + "PremiumOverride": 1, + "BogoBuy": 0, + "BogoGet": 0, + "UrlOverride": "" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/TwitchPrimeUdyatIridosSyandanaStoreItem", + "ShowInMarket": true, + "HideFromMarket": false, + "SupporterPack": false, + "Discount": 0, + "BogoBuy": 0, + "BogoGet": 0, + "PremiumOverride": 1, + "RegularOverride": 0, + "StartDate": { "$date": { "$numberLong": "1683828000000" } }, + "EndDate": { "$date": { "$numberLong": "1687110900000" } }, + "DefaultPremium": 1, + "DefaulRegular": 0, + "LocalizedItemName": "FREE WITH PRIME GAMING" + }, + { + "TypeName": "/Lotus/Types/StoreItems/Packages/TwitchPrimeUdyatIridosSyandanaStoreItemNoLogo", + "ShowInMarket": true, + "HideFromMarket": false, + "SupporterPack": false, + "Discount": 0, + "BogoBuy": 0, + "BogoGet": 0, + "PremiumOverride": 1, + "RegularOverride": 0, + "StartDate": { "$date": { "$numberLong": "1683828000000" } }, + "EndDate": { "$date": { "$numberLong": "1687110900000" } } + } + ], + "InGameMarket": { + "LandingPage": { + "Categories": [ + { + "CategoryName": "DUVIRI_PARADOX", + "Name": "/Lotus/Language/Store/Store_DuviriParadox", + "Icon": "duviriparadox", + "AddToMenu": true, + "Items": [ + "/Lotus/Types/StoreItems/Packages/RoyalSteedBundle", + "/Lotus/Types/StoreItems/Packages/DeluxeBundles/BaruukDeluxeSkinBundle", + "/Lotus/Types/StoreItems/Packages/DeluxeBundles/WispDeluxeSkinBundle", + "/Lotus/Types/StoreItems/Packages/VoidAdornmentIVBundle", + "/Lotus/Types/StoreItems/Packages/DuviriBundleFabledWarrior", + "/Lotus/Types/StoreItems/Packages/AdultOperatorSuitArabicBundle", + "/Lotus/Types/StoreItems/Packages/DuviriWeaponsBundle", + "/Lotus/StoreItems/Upgrades/Skins/Duviri/DuviriSwordTowerShieldSkin", + "/Lotus/StoreItems/Weapons/Tenno/Bows/DaxDuviriAsymetricalBow/DaxDuviriAsymmetricalLongBowPlayerWeapon", + "/Lotus/Types/StoreItems/Packages/DuviriHorseBundleAetigo", + "/Lotus/Types/StoreItems/Packages/DuviriHorseBundlePsyacus", + "/Lotus/Types/StoreItems/Packages/DuviriHorseBundleAccessories", + "/Lotus/Types/StoreItems/Packages/Tattoo/TattooBundleDuviri", + "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/SWKatixEarAcc" + ] + }, + { + "CategoryName": "TENNOGEN", + "Name": "/Lotus/Language/Menu/Store_Tennogen", + "Icon": "tennogen", + "Items": [ + "/Lotus/StoreItems/Upgrades/Skins/Runner/SWGaussNitrolystSkin", + "/Lotus/StoreItems/Upgrades/Skins/Scarves/SWRetrorolystSyandana", + "/Lotus/StoreItems/Upgrades/Skins/BrokenFrame/SWXakuDeatheaSkin", + "/Lotus/StoreItems/Upgrades/Skins/Sentient/SWCalibanScionHelmet", + "/Lotus/StoreItems/Upgrades/Skins/Scarves/SWAlocanaSyandana", + "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/SWKatixEarAcc" + ] + }, + { + "CategoryName": "POPULAR", + "Name": "/Lotus/Language/Menu/StorePopular", + "Icon": "popular", + "Items": [ + "/Lotus/Types/StoreItems/Packages/TwitchPrimeUdyatIridosSyandanaStoreItem", + "/Lotus/Types/StoreItems/Packages/TwitchPrimeUdyatIridosSyandanaStoreItemNoLogo", + "/Lotus/Types/StoreItems/Packages/AdultOperatorSuitArabicBundle", + "/Lotus/Types/StoreItems/Packages/RoyalSteedBundle", + "/Lotus/Types/StoreItems/Packages/WarframeBundles/CitrineItemsBundle", + "/Lotus/Types/StoreItems/Packages/DuviriWeaponsBundle", + "/Lotus/Types/StoreItems/Packages/DeluxeBundles/MesaVoltDeluxeSkinBundle", + "/Lotus/StoreItems/Weapons/Tenno/Bows/DaxDuviriAsymetricalBow/DaxDuviriAsymmetricalLongBowPlayerWeapon", + "/Lotus/Types/StoreItems/Packages/DuvArmorBundle", + "/Lotus/Types/StoreItems/Packages/DeluxeBundles/TitaniaDeluxeIISkinBundle", + "/Lotus/Types/StoreItems/Packages/DuviriBundleFabledWarrior", + "/Lotus/Types/StoreItems/Packages/FormaPack", + "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst" + ] + }, + { + "CategoryName": "DUVIRI_CHOICES", + "Name": "/Lotus/Language/Store/Store_DuviriChoices", + "Icon": "duvirichoices", + "AddToMenu": true, + "Items": [] + }, + { + "CategoryName": "PREMIUM_BUNDLES", + "Name": "/Lotus/Language/Store/Store_PremiumBundles", + "Icon": "premiumbundles", + "Items": [ + "/Lotus/Types/StoreItems/Packages/PrimeAccess1Tier3StoreItem", + "/Lotus/Types/StoreItems/Packages/PrimeAccess1AccessoryStoreItem", + "/Lotus/Types/StoreItems/Packages/AOTZSupporterPackB", + "/Lotus/Types/StoreItems/Packages/VeilbreakerSupporterPack", + "/Lotus/Types/StoreItems/Packages/InitiateIIIPCPack" + ] + }, + { "CategoryName": "WISH_LIST", "Name": "/Lotus/Language/Menu/Store_Wishlist", "Icon": "wishlist", "Items": [] } + ] + } + }, + "Invasions": [ + { + "_id": { "$oid": "645fb07dae4175e0955124cc" }, + "Faction": "FC_CORPUS", + "DefenderFaction": "FC_GRINEER", + "Node": "SolNode181", + "Count": -24166, + "Goal": 43000, + "LocTag": "/Lotus/Language/Menu/CorpusInvasionGeneric", + "Completed": false, + "ChainID": { "$oid": "645fb07dae4175e0955124cc" }, + "AttackerReward": { + "countedItems": [ + { "ItemType": "/Lotus/Types/Recipes/Weapons/WeaponParts/SnipetronVandalReceiver", "ItemCount": 1 } + ] + }, + "AttackerMissionInfo": { "seed": 681039, "faction": "FC_GRINEER" }, + "DefenderReward": { + "countedItems": [ + { "ItemType": "/Lotus/Types/Recipes/Weapons/GrineerCombatKnifeSortieBlueprint", "ItemCount": 1 } + ] + }, + "DefenderMissionInfo": { "seed": 563914, "faction": "FC_CORPUS" }, + "Activation": { "$date": { "$numberLong": "1684041542357" } } + }, + { + "_id": { "$oid": "646101fe9691a8bbcb55c3c4" }, + "Faction": "FC_GRINEER", + "DefenderFaction": "FC_CORPUS", + "Node": "SolNode88", + "Count": 1999, + "Goal": 42000, + "LocTag": "/Lotus/Language/Menu/GrineerInvasionGeneric", + "Completed": false, + "ChainID": { "$oid": "646101fe9691a8bbcb55c3c4" }, + "AttackerReward": { + "countedItems": [ + { "ItemType": "/Lotus/Types/Recipes/Weapons/WeaponParts/GrineerCombatKnifeHeatsink", "ItemCount": 1 } + ] + }, + "AttackerMissionInfo": { "seed": 807737, "faction": "FC_CORPUS" }, + "DefenderReward": { + "countedItems": [{ "ItemType": "/Lotus/Types/Recipes/Weapons/SnipetronVandalBlueprint", "ItemCount": 1 }] + }, + "DefenderMissionInfo": { "seed": 977649, "faction": "FC_GRINEER" }, + "Activation": { "$date": { "$numberLong": "1684151815904" } } + }, + { + "_id": { "$oid": "64613eed44967c3cb337c814" }, + "Faction": "FC_INFESTATION", + "DefenderFaction": "FC_CORPUS", + "Node": "SettlementNode20", + "Count": -22519, + "Goal": 30000, + "LocTag": "/Lotus/Language/Menu/InfestedInvasionBoss", + "Completed": false, + "ChainID": { "$oid": "64610c89252a577ba6a1037f" }, + "AttackerReward": [], + "AttackerMissionInfo": { "seed": 791152, "faction": "FC_CORPUS" }, + "DefenderReward": { + "countedItems": [{ "ItemType": "/Lotus/Types/Items/MiscItems/InfestedAladCoordinate", "ItemCount": 1 }] + }, + "DefenderMissionInfo": { "seed": 718522, "faction": "FC_INFESTATION", "missionReward": [] }, + "Activation": { "$date": { "$numberLong": "1684094701146" } } + }, + { + "_id": { "$oid": "64616b751d015ec90a210390" }, + "Faction": "FC_INFESTATION", + "DefenderFaction": "FC_CORPUS", + "Node": "SolNode2", + "Count": -33351, + "Goal": 33000, + "LocTag": "/Lotus/Language/Menu/InfestedInvasionGeneric", + "Completed": true, + "ChainID": { "$oid": "64616b751d015ec90a210390" }, + "AttackerReward": [], + "AttackerMissionInfo": { "seed": 647299, "faction": "FC_CORPUS" }, + "DefenderReward": { + "countedItems": [{ "ItemType": "/Lotus/Types/Items/Research/EnergyComponent", "ItemCount": 3 }] + }, + "DefenderMissionInfo": { "seed": 742879, "faction": "FC_INFESTATION" }, + "Activation": { "$date": { "$numberLong": "1684112165933" } } + }, + { + "_id": { "$oid": "6461abe9f095d27b7d58b85d" }, + "Faction": "FC_INFESTATION", + "DefenderFaction": "FC_CORPUS", + "Node": "SolNode101", + "Count": -50443, + "Goal": 50000, + "LocTag": "/Lotus/Language/Menu/InfestedInvasionGeneric", + "Completed": true, + "ChainID": { "$oid": "64616b751d015ec90a210390" }, + "AttackerReward": [], + "AttackerMissionInfo": { "seed": 171724, "faction": "FC_CORPUS" }, + "DefenderReward": { + "countedItems": [{ "ItemType": "/Lotus/Types/Items/Research/BioComponent", "ItemCount": 1 }] + }, + "DefenderMissionInfo": { "seed": 425227, "faction": "FC_INFESTATION" }, + "Activation": { "$date": { "$numberLong": "1684122601447" } } + }, + { + "_id": { "$oid": "6461abe9f095d27b7d58b85e" }, + "Faction": "FC_INFESTATION", + "DefenderFaction": "FC_CORPUS", + "Node": "SolNode104", + "Count": -19314, + "Goal": 30000, + "LocTag": "/Lotus/Language/Menu/InfestedInvasionBoss", + "Completed": false, + "ChainID": { "$oid": "64616b751d015ec90a210390" }, + "AttackerReward": [], + "AttackerMissionInfo": { "seed": 895670, "faction": "FC_CORPUS" }, + "DefenderReward": { + "countedItems": [{ "ItemType": "/Lotus/Types/Items/Research/EnergyComponent", "ItemCount": 3 }] + }, + "DefenderMissionInfo": { "seed": 842073, "faction": "FC_INFESTATION", "missionReward": [] }, + "Activation": { "$date": { "$numberLong": "1684122601447" } } + }, + { + "_id": { "$oid": "6461ccb91363cb8064240e50" }, + "Faction": "FC_INFESTATION", + "DefenderFaction": "FC_CORPUS", + "Node": "SolNode66", + "Count": -41379, + "Goal": 41000, + "LocTag": "/Lotus/Language/Menu/InfestedInvasionGeneric", + "Completed": true, + "ChainID": { "$oid": "64616b751d015ec90a210390" }, + "AttackerReward": [], + "AttackerMissionInfo": { "seed": 327151, "faction": "FC_CORPUS" }, + "DefenderReward": { + "countedItems": [{ "ItemType": "/Lotus/Types/Items/Research/EnergyComponent", "ItemCount": 3 }] + }, + "DefenderMissionInfo": { "seed": 51333, "faction": "FC_INFESTATION" }, + "Activation": { "$date": { "$numberLong": "1684131001372" } } + } + ], + "HubEvents": [], + "NodeOverrides": [ + { "_id": { "$oid": "549b18e9b029cef5991d6aec" }, "Node": "EuropaHUB", "Hide": true }, + { "_id": { "$oid": "54a1737aeb658f6cbccf70ff" }, "Node": "ErisHUB", "Hide": true }, + { "_id": { "$oid": "54a736ddec12f80bd6e9e326" }, "Node": "VenusHUB", "Hide": true }, + { "_id": { "$oid": "5ad9f9bb6df82a56eabf3d44" }, "Node": "SolNode802", "Seed": 9488862 }, + { + "_id": { "$oid": "5b8817c2bd4f253264d6aa91" }, + "Node": "EarthHUB", + "Hide": false, + "LevelOverride": "/Lotus/Levels/Proc/Hub/RelayStationHubTwoB", + "Activation": { "$date": { "$numberLong": "1535646600000" } } + }, + { + "_id": { "$oid": "5d24d1f674491d51f8d44473" }, + "Node": "MercuryHUB", + "Hide": true, + "LevelOverride": "/Lotus/Levels/Proc/Hub/RelayStationHubHydroid", + "Activation": { "$date": { "$numberLong": "1563030000000" } } + } + ], + "VoidTraders": [ + { + "_id": { "$oid": "5d1e07a0a38e4a4fdd7cefca" }, + "Activation": { "$date": { "$numberLong": "1684501200000" } }, + "Expiry": { "$date": { "$numberLong": "1684674000000" } }, + "Character": "Baro'Ki Teel", + "Node": "MercuryHUB" + } + ], + "PrimeVaultTraders": [ + { + "_id": { "$oid": "631f8c4ac36af423770eaa97" }, + "Activation": { "$date": { "$numberLong": "1683223200000" } }, + "Completed": false, + "InitialStartDate": { "$date": { "$numberLong": "1662738144266" } }, + "Node": "TradeHUB1", + "Manifest": [ + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVNovaPrimeSinglePack", "PrimePrice": 6 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVNovaTrinityPrimeDualPack", "PrimePrice": 10 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVTrinityPrimeSinglePack", "PrimePrice": 6 }, + { "ItemType": "/Lotus/StoreItems/Powersuits/AntiMatter/NovaPrime", "PrimePrice": 3 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVEdoPrimeArmorSet", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/PrimeAccessSigilFive", "PrimePrice": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Pistols/PrimeVasto/PrimeVastoPistol", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/LongGuns/PrimeSoma/PrimeSomaRifle", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Powersuits/Trinity/TrinityPrime", "PrimePrice": 3 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVKavasaPrimeKubrowArmor", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MeleeDangles/ScrollingPrimeMeleeDangle", "PrimePrice": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/PrimeDualKamas/PrimeDualKamas", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/NovaPrimeBobbleHead", "PrimePrice": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TrinityPrimeBobbleHead", "PrimePrice": 1 }, + { + "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T1VoidProjectionNovaTrinityVaultABronze", + "RegularPrice": 1 + }, + { + "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T2VoidProjectionNovaTrinityVaultABronze", + "RegularPrice": 1 + }, + { + "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T3VoidProjectionNovaTrinityVaultABronze", + "RegularPrice": 1 + }, + { + "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T4VoidProjectionNovaTrinityVaultABronze", + "RegularPrice": 1 + } + ], + "Expiry": { "$date": { "$numberLong": "1685718000000" } }, + "EvergreenManifest": [ + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/LongGuns/PrimeBurston/PrimeBurston", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Rifle/BratonPrime", "PrimePrice": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/DualDagger/FangPrimeDagger", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Pistols/PrimeLex/PrimeLex", "PrimePrice": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Game/ShipScenes/PrimeLisetFiligreeScene", "PrimePrice": 1 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVAviaPrimeArmorSet", "PrimePrice": 2 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVVayasPrimeAccessories", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MeleeDangles/TwitchPrimeMeleeDangle", "PrimePrice": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/PrimeAviaSyandana", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/PrimeTwitchScarf", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/TwitchPrimeScarf", "PrimePrice": 2 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/TwitchPrimeSigil", "PrimePrice": 1 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVNecraloidBundle", "RegularPrice": 10 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/LisetSkinTwitchPrime", "RegularPrice": 10 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/InfMembraneCape", "RegularPrice": 10 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/MiscItems/PrimeBucks", "RegularPrice": 1 }, + { "ItemType": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVVoidTraceBundle", "RegularPrice": 1 } + ], + "ScheduleInfo": [ + { + "Expiry": { "$date": { "$numberLong": "1667498400000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVEquinoxWukongPrimeDualPack" + }, + { + "Expiry": { "$date": { "$numberLong": "1669921200000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVValkyrSarynPrimeDualPack" + }, + { + "Expiry": { "$date": { "$numberLong": "1672945200000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1668711600000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVOberonPrimeSinglePack" + }, + { + "Expiry": { "$date": { "$numberLong": "1675364400000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1671130800000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVVoltLokiPrimeDualPack" + }, + { + "Expiry": { "$date": { "$numberLong": "1677783600000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1674154800000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVAtlasVaubanPrimeDualPack" + }, + { + "Expiry": { "$date": { "$numberLong": "1680804000000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1676473200000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVNekrosOberonPrimeDualPack" + }, + { + "Expiry": { "$date": { "$numberLong": "1683223200000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1679594400000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVMagRhinoPrimeDualPack" + }, + { + "Expiry": { "$date": { "$numberLong": "1685718000000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1682013600000" } }, + "FeaturedItem": "/Lotus/Types/StoreItems/Packages/MegaPrimeVault/MPVNovaTrinityPrimeDualPack" + }, + { + "Expiry": { "$date": { "$numberLong": "1688666400000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1688666400000" } } + }, + { + "Expiry": { "$date": { "$numberLong": "1691085600000" } }, + "PreviewHiddenUntil": { "$date": { "$numberLong": "1691085600000" } } + } + ] + } + ], + "VoidStorms": [ + { + "_id": { "$oid": "6462606114e0caeeaead133d" }, + "Node": "CrewBattleNode519", + "Activation": { "$date": { "$numberLong": "1684171201821" } }, + "Expiry": { "$date": { "$numberLong": "1684176601821" } }, + "ActiveMissionTier": "VoidT1" + }, + { + "_id": { "$oid": "6462606114e0caeeaead1342" }, + "Node": "CrewBattleNode538", + "Activation": { "$date": { "$numberLong": "1684171201834" } }, + "Expiry": { "$date": { "$numberLong": "1684176601834" } }, + "ActiveMissionTier": "VoidT4" + }, + { + "_id": { "$oid": "6462606114e0caeeaead133e" }, + "Node": "CrewBattleNode511", + "Activation": { "$date": { "$numberLong": "1684171201825" } }, + "Expiry": { "$date": { "$numberLong": "1684176601825" } }, + "ActiveMissionTier": "VoidT1" + }, + { + "_id": { "$oid": "6462606114e0caeeaead1340" }, + "Node": "CrewBattleNode524", + "Activation": { "$date": { "$numberLong": "1684171201829" } }, + "Expiry": { "$date": { "$numberLong": "1684176601829" } }, + "ActiveMissionTier": "VoidT3" + }, + { + "_id": { "$oid": "6462606114e0caeeaead1341" }, + "Node": "CrewBattleNode527", + "Activation": { "$date": { "$numberLong": "1684171201832" } }, + "Expiry": { "$date": { "$numberLong": "1684176601832" } }, + "ActiveMissionTier": "VoidT4" + }, + { + "_id": { "$oid": "6462606114e0caeeaead133f" }, + "Node": "CrewBattleNode533", + "Activation": { "$date": { "$numberLong": "1684171201827" } }, + "Expiry": { "$date": { "$numberLong": "1684176601827" } }, + "ActiveMissionTier": "VoidT2" + } + ], + "PrimeAccessAvailability": { "State": "PRIME1" }, + "PrimeVaultAvailabilities": [false, false, false, false, false], + "PrimeTokenAvailability": true, + "DailyDeals": [ + { + "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Glaives/Boomerang/BoomerangWeapon", + "Activation": { "$date": { "$numberLong": "1684170000000" } }, + "Expiry": { "$date": { "$numberLong": "1684263600000" } }, + "Discount": 50, + "OriginalPrice": 150, + "SalePrice": 75, + "AmountTotal": 200, + "AmountSold": 10 + } + ], + "LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" }, + "PVPChallengeInstances": [ + { + "_id": { "$oid": "645e86d579eb01d9acfe6c1a" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeWeeklyStandardSet", + "startDate": { "$date": { "$numberLong": "1683916501934" } }, + "endDate": { "$date": { "$numberLong": "1684521301934" } }, + "params": [{ "n": "ScriptParamValue", "v": 0 }], + "isGenerated": true, + "PVPMode": "PVPMODE_NONE", + "subChallenges": [ + { "$oid": "645e86d579eb01d9acfe6c17" }, + { "$oid": "645e86d579eb01d9acfe6c18" }, + { "$oid": "645e86d579eb01d9acfe6c19" } + ], + "Category": "PVPChallengeTypeCategory_WEEKLY_ROOT" + }, + { + "_id": { "$oid": "645e86d579eb01d9acfe6c17" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeGameModeWins", + "startDate": { "$date": { "$numberLong": "1683916501934" } }, + "endDate": { "$date": { "$numberLong": "1684521301934" } }, + "params": [{ "n": "ScriptParamValue", "v": 6 }], + "isGenerated": true, + "PVPMode": "PVPMODE_ALL", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_WEEKLY" + }, + { + "_id": { "$oid": "645e86d579eb01d9acfe6c18" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeGameModeComplete", + "startDate": { "$date": { "$numberLong": "1683916501934" } }, + "endDate": { "$date": { "$numberLong": "1684521301934" } }, + "params": [{ "n": "ScriptParamValue", "v": 20 }], + "isGenerated": true, + "PVPMode": "PVPMODE_ALL", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_WEEKLY" + }, + { + "_id": { "$oid": "645e86d579eb01d9acfe6c19" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeOtherChallengeCompleteANY", + "startDate": { "$date": { "$numberLong": "1683916501934" } }, + "endDate": { "$date": { "$numberLong": "1684521301934" } }, + "params": [{ "n": "ScriptParamValue", "v": 10 }], + "isGenerated": true, + "PVPMode": "PVPMODE_ALL", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_WEEKLY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef03" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsMultiMEDIUM", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 4 }], + "isGenerated": true, + "PVPMode": "PVPMODE_TEAMDEATHMATCH", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef06" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballCatchesEASY", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 3 }], + "isGenerated": true, + "PVPMode": "PVPMODE_SPEEDBALL", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef04" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsSecondaryEASY", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 1 }], + "isGenerated": true, + "PVPMode": "PVPMODE_DEATHMATCH", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef00" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeFlagCaptureMEDIUM", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 4 }], + "isGenerated": true, + "PVPMode": "PVPMODE_CAPTURETHEFLAG", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef01" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeFlagReturnEASY", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 1 }], + "isGenerated": true, + "PVPMode": "PVPMODE_CAPTURETHEFLAG", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef02" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsWhileInAirHARD", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 3 }], + "isGenerated": true, + "PVPMode": "PVPMODE_TEAMDEATHMATCH", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef05" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsMeleeHARD", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 3 }], + "isGenerated": true, + "PVPMode": "PVPMODE_DEATHMATCH", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + }, + { + "_id": { "$oid": "646226f5e96f141d7499ef07" }, + "challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballPassesMEDIUM", + "startDate": { "$date": { "$numberLong": "1684154101206" } }, + "endDate": { "$date": { "$numberLong": "1684240501206" } }, + "params": [{ "n": "ScriptParamValue", "v": 6 }], + "isGenerated": true, + "PVPMode": "PVPMODE_SPEEDBALL", + "subChallenges": [], + "Category": "PVPChallengeTypeCategory_DAILY" + } + ], + "PersistentEnemies": [], + "PVPAlternativeModes": [], + "PVPActiveTournaments": [], + "ProjectPct": [35.71334329543191, 76.09250633775825, 0], + "ConstructionProjects": [], + "TwitchPromos": [], + "ExperimentRecommended": [], + "ForceLogoutVersion": 0, + "FeaturedGuilds": [ + { + "_id": { "$oid": "5303c4bd06c56f4168b5fed9" }, + "Name": "Miau after Tomorrow", + "Tier": 1, + "AllianceId": { "$oid": "53f9876c07c56f85b1c24ed7" }, + "Emblem": true + }, + { + "_id": { "$oid": "56ab8b2407c56fd145c91aa5" }, + "Name": "Slayers of Darkness", + "Tier": 2, + "AllianceId": { "$oid": "53f9876c07c56f85b1c24ed7" }, + "Emblem": true + }, + { + "_id": { "$oid": "57ed05cb08c56ffd67386105" }, + "Name": "Nazaryk", + "Tier": 3, + "AllianceId": { "$oid": "5fdcf602fc5cef2d337800e0" }, + "Emblem": true + }, + { "_id": { "$oid": "570f9bda08c56f0887fb6db5" }, "Name": "GentleManz", "Tier": 4, "Emblem": true }, + { + "_id": { "$oid": "56d8b39408c56fd89a1799ec" }, + "Name": "Phantom Vanguard", + "Tier": 5, + "AllianceId": { "$oid": "55e270f706c56f2e2f0bb7d6" }, + "Emblem": true + }, + { + "_id": { "$oid": "54e44a5006c56f7eab0d5aa9" }, + "Name": "Violet Church", + "Tier": 3, + "AllianceId": { "$oid": "56c44d0b08c56f5c367b4665" }, + "Emblem": true + } + ], + "SeasonInfo": { + "Activation": { "$date": { "$numberLong": "1669824000000" } }, + "Expiry": { "$date": { "$numberLong": "1684432800000" } }, + "AffiliationTag": "RadioLegionIntermission7Syndicate", + "Season": 9, + "Phase": 0, + "Params": "", + "ActiveChallenges": [ + { + "_id": { "$oid": "001000240000000000000335" }, + "Daily": true, + "Activation": { "$date": { "$numberLong": "1683936000000" } }, + "Expiry": { "$date": { "$numberLong": "1684195200000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Daily/SeasonDailyKillEnemiesWithPrimary" + }, + { + "_id": { "$oid": "001000240000000000000336" }, + "Daily": true, + "Activation": { "$date": { "$numberLong": "1684022400000" } }, + "Expiry": { "$date": { "$numberLong": "1684281600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Daily/SeasonDailyKillEnemiesWithMelee" + }, + { + "_id": { "$oid": "001000250000000000000344" }, + "Daily": true, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684368000000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Daily/SeasonDailyKillEnemiesWithFinishers" + }, + { + "_id": { "$oid": "001000250000000000000337" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyUnlockDragonVaults" + }, + { + "_id": { "$oid": "001000250000000000000338" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyCompleteDisruptionConduits" + }, + { + "_id": { "$oid": "001000250000000000000339" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyRailjackMissions" + }, + { + "_id": { "$oid": "001000250000000000000340" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyMineRarePlainsResources" + }, + { + "_id": { "$oid": "001000250000000000000341" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyCompleteSyndicateMissions" + }, + { + "_id": { "$oid": "001000250000000000000342" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/WeeklyHard/SeasonWeeklyHardCompleteSteelPathMissions" + }, + { + "_id": { "$oid": "001000250000000000000343" }, + "Activation": { "$date": { "$numberLong": "1684108800000" } }, + "Expiry": { "$date": { "$numberLong": "1684713600000" } }, + "Challenge": "/Lotus/Types/Challenges/Seasons/WeeklyHard/SeasonWeeklyHardKillEnemiesSteelPath" + } + ] + }, + "Tmp": "{\"sfn\":554}" +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..a75f01a30 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,113 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + //"target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": ["es2023"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + //"module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + "resolveJsonModule": true /* Enable importing .json files. */, + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./build/" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + //"noUnusedLocals": true /* Enable error reporting when local variables aren't read. */, + "noUnusedParameters": true /* Raise an error when a function parameter isn't read. */, + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, + "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/tsturnonagain b/tsturnonagain new file mode 100644 index 000000000..5c504b8ad --- /dev/null +++ b/tsturnonagain @@ -0,0 +1 @@ +nounusedlocals, \ No newline at end of file