diff --git a/.gitignore b/.gitignore
index 668b69c..55ea89f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,6 +50,8 @@ Thumbs.db
*.zip
*.as
*.bin
+.env
+/assets
# Nitro
/src/configuration.json
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /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
index 0ac3c73..cd62ce3 100644
--- a/README.md
+++ b/README.md
@@ -1,21 +1,8 @@
-### Nitro Converter
+# Nitro Converter
-# What files does this tool convert?
+This tool is used to generate `.nitro` bundled assets for use with the Nitro Client
-The converter currently supports the following files:
-
-- furnidata.xml
-- figuredata.xml
-- figuremap.xml
-- effectmap.xml
-- external_texts.txt
-- productdata.txt
-- Furniture swfs
-- Pet swfs
-- Figure swfs
-- Effect swfs
-
-# Configuration
+## Configuration
You must rename `configuration.json.example` to `configuration.json`
@@ -23,35 +10,44 @@ The simplest way to set your configuration is by changing the `external.variable
You may set any of the urls to a local path on your system or a remote url. A local path is recommended as the tool will run a lot quicker for downloading.
-| key | value |
-| ------ | ------ |
-| output.folder | The folder where converted assets will be saved to |
-| flash.client.url | The base url where figures/pets/effects are stored, eg https://url/gordon/ |
-| furnidata.load.url | The url to your furnidata, can be XML or JSON, eg https://url/gamedata/furnidata.xml |
-| productdata.load.url | The url to your productdata.txt, eg https://url/gamedata/productdata.txt |
-| figuremap.load.url | The url to your figure map, can be XML or JSON, eg https://url/gordon/figuremap.xml |
-| effectmap.load.url | The url to your effect map, can be XML or JSON, eg https://url/gordon/effectmap.xml |
-| dynamic.download.pet.url | The full url where pets are stored, eg https://url/gordon/%className%.swf |
-| dynamic.download.figure.url | The full url where figures are stored, eg https://url/gordon/%className%.swf |
-| dynamic.download.effect.url | The full url where effects are stored, eg https://url/gordon/%className%.swf |
-| flash.dynamic.download.url | The base url where furniture is stored, eg https://url/dcr/hof_furni/ |
+| key | value |
+| ------------------------------ | ------------------------------------------------------------------------------------ |
+| output.folder | The folder where converted assets will be saved to |
+| flash.client.url | The base url where figures/pets/effects are stored, eg https://url/gordon/ |
+| furnidata.load.url | The url to your furnidata, can be XML or JSON, eg https://url/gamedata/furnidata.xml |
+| productdata.load.url | The url to your productdata.txt, eg https://url/gamedata/productdata.txt |
+| figuremap.load.url | The url to your figure map, can be XML or JSON, eg https://url/gordon/figuremap.xml |
+| effectmap.load.url | The url to your effect map, can be XML or JSON, eg https://url/gordon/effectmap.xml |
+| dynamic.download.pet.url | The full url where pets are stored, eg https://url/gordon/%className%.swf |
+| dynamic.download.figure.url | The full url where figures are stored, eg https://url/gordon/%className%.swf |
+| dynamic.download.effect.url | The full url where effects are stored, eg https://url/gordon/%className%.swf |
+| flash.dynamic.download.url | The base url where furniture is stored, eg https://url/dcr/hof_furni/ |
| dynamic.download.furniture.url | The full url where furniture is stored, eg https://url/dcr/hof_furni/%className%.swf |
-| external.variables.url | The url to your external variables, eg https://url/gamedata/external_variables.txt |
-| external.texts.url | The url to your external texts, eg https://url/gamedata/external_texts.txt |
-| convert.productdata | Either `0` to skip or `1` to run |
-| convert.externaltexts | Either `0` to skip or `1` to run |
-| convert.figure | Either `0` to skip or `1` to run |
-| convert.figuredata | Either `0` to skip or `1` to run |
-| convert.effect | Either `0` to skip or `1` to run |
-| convert.furniture | Either `0` to skip or `1` to run |
-| convert.pet | Either `0` to skip or `1` to run |
+| external.variables.url | The url to your external variables, eg https://url/gamedata/external_variables.txt |
+| external.texts.url | The url to your external texts, eg https://url/gamedata/external_texts.txt |
+| convert.productdata | Either `0` to skip or `1` to run |
+| convert.externaltexts | Either `0` to skip or `1` to run |
+| convert.figure | Either `0` to skip or `1` to run |
+| convert.figuredata | Either `0` to skip or `1` to run |
+| convert.effect | Either `0` to skip or `1` to run |
+| convert.furniture | Either `0` to skip or `1` to run |
+| convert.pet | Either `0` to skip or `1` to run |
-# Running the converter
+## Running the converter
+
+**Make sure you run `yarn install` before first use.**
To run the converter open a new terminal / console window in the main converter directory.
-**Make sure you run ``npm i`` before first use.**
+The converter has a few different start commands:
-Type `npm start` and the converter will start running, only errors will be outputted in the console.
+| key | value |
+| ---------------------- | ---------------------------------------------------------- |
+| yarn start | Will download and convert assets as set in the config |
+| yarn start:bundle | Will bundle decompressed `.nitro` assets (json / png) |
+| yarn start:extract | Will extract `.nitro` assets which can be used for editing |
+| yarn start:convert-swf | Will convert inputted `.swf` assets to `.nitro` |
-The converter will skip any assets that already exist but will always reconvert your XMLs / copy your JSONS to the ``gamedata`` folder to ensure you always have the latest copy.
+When you run `start:bundle | start:extract | start:convert-swf` for the first time it will automatically generate a folder structure for placing your assets for conversion.
+
+The converter will skip any assets that already exist but will always reconvert your XMLs / copy your JSONS to the `gamedata` folder to ensure you always have the latest copy.
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 1bd356b..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,3153 +0,0 @@
-{
- "name": "nitro-converter",
- "version": "1.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
- "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.10.4"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz",
- "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- }
- }
- },
- "@babel/runtime": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz",
- "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@eslint/eslintrc": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
- "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.1.1",
- "espree": "^7.3.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^3.13.1",
- "lodash": "^4.17.20",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- }
- },
- "@jimp/bmp": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz",
- "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
- "bmp-js": "^0.1.0"
- }
- },
- "@jimp/core": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz",
- "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
- "any-base": "^1.1.0",
- "buffer": "^5.2.0",
- "exif-parser": "^0.1.12",
- "file-type": "^9.0.0",
- "load-bmfont": "^1.3.1",
- "mkdirp": "^0.5.1",
- "phin": "^2.9.1",
- "pixelmatch": "^4.0.2",
- "tinycolor2": "^1.4.1"
- }
- },
- "@jimp/custom": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz",
- "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/core": "^0.16.1"
- }
- },
- "@jimp/gif": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz",
- "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
- "gifwrap": "^0.9.2",
- "omggif": "^1.0.9"
- }
- },
- "@jimp/jpeg": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz",
- "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
- "jpeg-js": "0.4.2"
- }
- },
- "@jimp/plugin-blit": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz",
- "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-blur": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz",
- "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-circle": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz",
- "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-color": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz",
- "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
- "tinycolor2": "^1.4.1"
- }
- },
- "@jimp/plugin-contain": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz",
- "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-cover": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz",
- "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-crop": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz",
- "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-displace": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz",
- "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-dither": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz",
- "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-fisheye": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz",
- "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-flip": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz",
- "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-gaussian": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz",
- "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-invert": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz",
- "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-mask": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz",
- "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-normalize": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz",
- "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-print": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz",
- "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
- "load-bmfont": "^1.4.0"
- }
- },
- "@jimp/plugin-resize": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz",
- "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-rotate": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz",
- "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-scale": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz",
- "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-shadow": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz",
- "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugin-threshold": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz",
- "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
- }
- },
- "@jimp/plugins": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz",
- "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/plugin-blit": "^0.16.1",
- "@jimp/plugin-blur": "^0.16.1",
- "@jimp/plugin-circle": "^0.16.1",
- "@jimp/plugin-color": "^0.16.1",
- "@jimp/plugin-contain": "^0.16.1",
- "@jimp/plugin-cover": "^0.16.1",
- "@jimp/plugin-crop": "^0.16.1",
- "@jimp/plugin-displace": "^0.16.1",
- "@jimp/plugin-dither": "^0.16.1",
- "@jimp/plugin-fisheye": "^0.16.1",
- "@jimp/plugin-flip": "^0.16.1",
- "@jimp/plugin-gaussian": "^0.16.1",
- "@jimp/plugin-invert": "^0.16.1",
- "@jimp/plugin-mask": "^0.16.1",
- "@jimp/plugin-normalize": "^0.16.1",
- "@jimp/plugin-print": "^0.16.1",
- "@jimp/plugin-resize": "^0.16.1",
- "@jimp/plugin-rotate": "^0.16.1",
- "@jimp/plugin-scale": "^0.16.1",
- "@jimp/plugin-shadow": "^0.16.1",
- "@jimp/plugin-threshold": "^0.16.1",
- "timm": "^1.6.1"
- }
- },
- "@jimp/png": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz",
- "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
- "pngjs": "^3.3.3"
- }
- },
- "@jimp/tiff": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz",
- "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "utif": "^2.0.1"
- }
- },
- "@jimp/types": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz",
- "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/bmp": "^0.16.1",
- "@jimp/gif": "^0.16.1",
- "@jimp/jpeg": "^0.16.1",
- "@jimp/png": "^0.16.1",
- "@jimp/tiff": "^0.16.1",
- "timm": "^1.6.1"
- }
- },
- "@jimp/utils": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz",
- "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "regenerator-runtime": "^0.13.3"
- }
- },
- "@jvitela/mustache-wax": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@jvitela/mustache-wax/-/mustache-wax-1.0.3.tgz",
- "integrity": "sha512-5M5p8d9YQwEDSa0oLoeCZ8ECiM2ZJLKxI/D0pDByiNBJw+4Tizjk/NMIjGx7IoJOGBnWcfHX3Pwd6m/MpMHoGA=="
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
- "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.4",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
- "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
- "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.4",
- "fastq": "^1.6.0"
- }
- },
- "@types/bytebuffer": {
- "version": "5.0.42",
- "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz",
- "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==",
- "dev": true,
- "requires": {
- "@types/long": "*",
- "@types/node": "*"
- }
- },
- "@types/json-schema": {
- "version": "7.0.7",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
- "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
- "dev": true
- },
- "@types/long": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
- "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==",
- "dev": true
- },
- "@types/node": {
- "version": "14.14.28",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz",
- "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==",
- "dev": true
- },
- "@types/node-fetch": {
- "version": "2.5.8",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz",
- "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "form-data": "^3.0.0"
- },
- "dependencies": {
- "form-data": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
- "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- }
- }
- },
- "@types/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
- "dev": true
- },
- "@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
- },
- "@types/xml2js": {
- "version": "0.4.8",
- "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz",
- "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@typescript-eslint/eslint-plugin": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz",
- "integrity": "sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw==",
- "dev": true,
- "requires": {
- "@typescript-eslint/experimental-utils": "4.15.1",
- "@typescript-eslint/scope-manager": "4.15.1",
- "debug": "^4.1.1",
- "functional-red-black-tree": "^1.0.1",
- "lodash": "^4.17.15",
- "regexpp": "^3.0.0",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- }
- },
- "@typescript-eslint/experimental-utils": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz",
- "integrity": "sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.3",
- "@typescript-eslint/scope-manager": "4.15.1",
- "@typescript-eslint/types": "4.15.1",
- "@typescript-eslint/typescript-estree": "4.15.1",
- "eslint-scope": "^5.0.0",
- "eslint-utils": "^2.0.0"
- }
- },
- "@typescript-eslint/parser": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz",
- "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "4.15.1",
- "@typescript-eslint/types": "4.15.1",
- "@typescript-eslint/typescript-estree": "4.15.1",
- "debug": "^4.1.1"
- }
- },
- "@typescript-eslint/scope-manager": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz",
- "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.15.1",
- "@typescript-eslint/visitor-keys": "4.15.1"
- }
- },
- "@typescript-eslint/types": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.1.tgz",
- "integrity": "sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz",
- "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.15.1",
- "@typescript-eslint/visitor-keys": "4.15.1",
- "debug": "^4.1.1",
- "globby": "^11.0.1",
- "is-glob": "^4.0.1",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz",
- "integrity": "sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.15.1",
- "eslint-visitor-keys": "^2.0.0"
- }
- },
- "acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true
- },
- "acorn-jsx": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
- "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
- "dev": true
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "amdefine": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.1.tgz",
- "integrity": "sha1-tcdcUyBS3M1qOcAGTHcsjVegbNI="
- },
- "ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "any-base": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
- "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="
- },
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "array-find-index": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
- "dev": true
- },
- "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
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
- },
- "aws4": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
- "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "bignumber.js": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz",
- "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg="
- },
- "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
- },
- "bl": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz",
- "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=",
- "requires": {
- "readable-stream": "~1.0.26"
- }
- },
- "bmp-js": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
- "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM="
- },
- "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,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
- },
- "buffer-equal": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
- "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs="
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "bytebuffer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
- "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=",
- "requires": {
- "long": "~3"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
- "dev": true
- },
- "camelcase-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
- "dev": true,
- "requires": {
- "camelcase": "^2.0.0",
- "map-obj": "^1.0.0"
- }
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "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==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "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=="
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "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==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.3.1",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
- }
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "requires": {
- "restore-cursor": "^3.1.0"
- }
- },
- "cli-spinners": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz",
- "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ=="
- },
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz",
- "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg="
- },
- "concat-frames": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/concat-frames/-/concat-frames-1.0.3.tgz",
- "integrity": "sha1-z+moFvJce3WWPZn+8vSqBFj7+Zs=",
- "requires": {
- "pixel-stream": "^1.0.3"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "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
- },
- "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,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "currently-unhandled": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
- "dev": true,
- "requires": {
- "array-find-index": "^1.0.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "dateformat": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
- "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
- "dev": true,
- "requires": {
- "get-stdin": "^4.0.1",
- "meow": "^3.3.0"
- }
- },
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "requires": {
- "clone": "^1.0.2"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "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,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dom-walk": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
- "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
- },
- "dynamic-dedupe": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz",
- "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=",
- "dev": true,
- "requires": {
- "xtend": "^4.0.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "requires": {
- "ansi-colors": "^4.1.1"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es6-promise": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
- "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "eslint": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz",
- "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "7.12.11",
- "@eslint/eslintrc": "^0.3.0",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^2.1.0",
- "eslint-visitor-keys": "^2.0.0",
- "espree": "^7.3.1",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "file-entry-cache": "^6.0.0",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.0.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash": "^4.17.20",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.1.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.0",
- "strip-json-comments": "^3.1.0",
- "table": "^6.0.4",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- }
- },
- "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,
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
- "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- }
- }
- },
- "eslint-visitor-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
- "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
- "dev": true
- },
- "espree": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
- "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
- "dev": true,
- "requires": {
- "acorn": "^7.4.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^1.3.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- }
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dev": true,
- "requires": {
- "estraverse": "^5.1.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
- "dev": true
- }
- }
- },
- "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,
- "requires": {
- "estraverse": "^5.2.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
- "dev": true
- }
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "exif-parser": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
- "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI="
- },
- "exif-reader": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/exif-reader/-/exif-reader-1.0.3.tgz",
- "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA=="
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "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=="
- },
- "fast-glob": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
- "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
- }
- },
- "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=="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fastq": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz",
- "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "file-entry-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
- "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
- "dev": true,
- "requires": {
- "flat-cache": "^3.0.4"
- }
- },
- "file-type": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
- "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw=="
- },
- "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,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "dev": true,
- "requires": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- }
- },
- "flatted": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
- "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "free-tex-packer-core": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/free-tex-packer-core/-/free-tex-packer-core-0.3.2.tgz",
- "integrity": "sha512-CauShorQ77Pgm+u2YalXX6HyR0rnkuccS3lIKCZpnBeAjcUV6SXCwswUGS8cbrvS5/dIwM5UeqFu02X86PPMkg==",
- "requires": {
- "@jvitela/mustache-wax": "^1.0.1",
- "jimp": "^0.2.28",
- "maxrects-packer": "^2.5.0",
- "mustache": "^2.3.0",
- "tinify": "^1.5.0"
- },
- "dependencies": {
- "bmp-js": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz",
- "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo="
- },
- "file-type": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
- "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
- },
- "jimp": {
- "version": "0.2.28",
- "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz",
- "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=",
- "requires": {
- "bignumber.js": "^2.1.0",
- "bmp-js": "0.0.3",
- "es6-promise": "^3.0.2",
- "exif-parser": "^0.1.9",
- "file-type": "^3.1.0",
- "jpeg-js": "^0.2.0",
- "load-bmfont": "^1.2.3",
- "mime": "^1.3.4",
- "mkdirp": "0.5.1",
- "pixelmatch": "^4.0.0",
- "pngjs": "^3.0.0",
- "read-chunk": "^1.0.1",
- "request": "^2.65.0",
- "stream-to-buffer": "^0.1.0",
- "tinycolor2": "^1.1.2",
- "url-regex": "^3.0.0"
- }
- },
- "jpeg-js": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz",
- "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII="
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- }
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
- "dev": true
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "gifwrap": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz",
- "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==",
- "requires": {
- "image-q": "^1.1.1",
- "omggif": "^1.0.10"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "global": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
- "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
- "requires": {
- "min-document": "^2.19.0",
- "process": "^0.11.10"
- }
- },
- "globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
- "dev": true,
- "requires": {
- "type-fest": "^0.8.1"
- }
- },
- "globby": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
- "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- },
- "dependencies": {
- "ignore": {
- "version": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
- "dev": true
- }
- }
- },
- "graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
- "dev": true
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
- },
- "har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "hosted-git-info": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
- "dev": true
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "image-q": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz",
- "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY="
- },
- "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,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ip-regex": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz",
- "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0="
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
- "dev": true
- },
- "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,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-core-module": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
- "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-finite": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
- "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "is-function": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
- "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-interactive": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
- "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
- },
- "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
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "jimp": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz",
- "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "@jimp/custom": "^0.16.1",
- "@jimp/plugins": "^0.16.1",
- "@jimp/types": "^0.16.1",
- "regenerator-runtime": "^0.13.3"
- }
- },
- "jpeg-js": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz",
- "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw=="
- },
- "jpg-stream": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/jpg-stream/-/jpg-stream-1.1.2.tgz",
- "integrity": "sha1-TboVnZ0ZNo3yExj2SM7pgKcr5Ac=",
- "requires": {
- "exif-reader": "^1.0.0",
- "pixel-stream": "^1.0.3"
- }
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
- },
- "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=="
- },
- "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "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,
- "requires": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- }
- },
- "load-bmfont": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz",
- "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==",
- "requires": {
- "buffer-equal": "0.0.1",
- "mime": "^1.3.4",
- "parse-bmfont-ascii": "^1.0.3",
- "parse-bmfont-binary": "^1.0.5",
- "parse-bmfont-xml": "^1.1.4",
- "phin": "^2.9.1",
- "xhr": "^2.0.1",
- "xtend": "^4.0.0"
- }
- },
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "lodash": {
- "version": "4.17.20",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
- "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
- },
- "log-symbols": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
- "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
- "requires": {
- "chalk": "^4.0.0"
- }
- },
- "long": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
- "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s="
- },
- "loud-rejection": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
- "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
- "dev": true,
- "requires": {
- "currently-unhandled": "^0.4.1",
- "signal-exit": "^3.0.0"
- }
- },
- "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,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "lzma-purejs": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/lzma-purejs/-/lzma-purejs-0.9.3.tgz",
- "integrity": "sha1-yJF+iUsbTbXIZbkn34ZO3edZzN4=",
- "requires": {
- "amdefine": "~0.1.0",
- "commander": "~2.0.0"
- }
- },
- "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
- },
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
- },
- "maxrects-packer": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/maxrects-packer/-/maxrects-packer-2.7.2.tgz",
- "integrity": "sha512-akd5IRLPqQeWlpJyRJyfYq86VB05zzbMIdyTgLxRk4z1H0A8g4oTJW31Yo6zO9piSRsFNYdzmgudW7J2g1gEhQ=="
- },
- "meow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
- "dev": true,
- "requires": {
- "camelcase-keys": "^2.0.0",
- "decamelize": "^1.1.2",
- "loud-rejection": "^1.0.0",
- "map-obj": "^1.0.1",
- "minimist": "^1.1.3",
- "normalize-package-data": "^2.3.4",
- "object-assign": "^4.0.1",
- "read-pkg-up": "^1.0.1",
- "redent": "^1.0.0",
- "trim-newlines": "^1.0.0"
- }
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.45.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
- "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
- },
- "mime-types": {
- "version": "2.1.28",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
- "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
- "requires": {
- "mime-db": "1.45.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- },
- "min-document": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
- "requires": {
- "dom-walk": "^0.1.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "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
- },
- "mustache": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz",
- "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ=="
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "node-fetch": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
- "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
- },
- "node-gzip": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/node-gzip/-/node-gzip-1.1.2.tgz",
- "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw=="
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
- }
- },
- "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
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
- },
- "omggif": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
- "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "ora": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz",
- "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==",
- "requires": {
- "bl": "^4.0.3",
- "chalk": "^4.1.0",
- "cli-cursor": "^3.1.0",
- "cli-spinners": "^2.5.0",
- "is-interactive": "^1.0.0",
- "log-symbols": "^4.0.0",
- "strip-ansi": "^6.0.0",
- "wcwidth": "^1.0.1"
- },
- "dependencies": {
- "bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "requires": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- }
- }
- },
- "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,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-bmfont-ascii": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
- "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU="
- },
- "parse-bmfont-binary": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
- "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY="
- },
- "parse-bmfont-xml": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
- "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
- "requires": {
- "xml-parse-from-string": "^1.0.0",
- "xml2js": "^0.4.5"
- }
- },
- "parse-headers": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz",
- "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA=="
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dev": true,
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "dev": true,
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "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
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "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
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
- "phin": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
- "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA=="
- },
- "picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
- "dev": true
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "dev": true,
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pixel-stream": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pixel-stream/-/pixel-stream-1.0.3.tgz",
- "integrity": "sha1-U+jFSyHVUIOTtTvLMrZKd1Xx+l4=",
- "requires": {
- "shallow-copy": "0.0.1"
- }
- },
- "pixelmatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
- "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=",
- "requires": {
- "pngjs": "^3.0.0"
- }
- },
- "png-stream": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/png-stream/-/png-stream-1.0.5.tgz",
- "integrity": "sha1-W8cWh+qJWUJ+lQ5Sx8yknipvBMY=",
- "requires": {
- "bl": "^0.9.3",
- "buffer-crc32": "^0.2.3",
- "buffer-equal": "^0.0.1",
- "pixel-stream": "^1.0.3"
- }
- },
- "pngjs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
- "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
- },
- "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
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
- },
- "promise-nodeify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/promise-nodeify/-/promise-nodeify-3.0.1.tgz",
- "integrity": "sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg=="
- },
- "proxying-agent": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/proxying-agent/-/proxying-agent-2.4.0.tgz",
- "integrity": "sha512-b9vDqIcViJZVsWPpQlp9Py74u+Wqd0a+kMkkg7zX58mwNtrNbOChNlRTM7lUrlpiwNzyJCV8+5D8rnZYLDFh7Q=="
- },
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
- },
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
- },
- "queue-microtask": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
- "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
- "dev": true
- },
- "read-chunk": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz",
- "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ="
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "dev": true,
- "requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- }
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dev": true,
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "redent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
- "dev": true,
- "requires": {
- "indent-string": "^2.1.0",
- "strip-indent": "^1.0.1"
- }
- },
- "reflect-metadata": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
- "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
- },
- "regenerator-runtime": {
- "version": "0.13.7",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
- "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
- },
- "regexpp": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
- "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
- "dev": true
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "dev": true,
- "requires": {
- "is-finite": "^1.0.0"
- }
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- }
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- },
- "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
- },
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "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,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "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=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "semver": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
- "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "shallow-copy": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
- "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA="
- },
- "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,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "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
- },
- "signal-exit": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
- "slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "dependencies": {
- "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,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "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,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "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
- }
- }
- },
- "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
- },
- "source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "dev": true,
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
- "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
- "dev": true
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "stream-to": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz",
- "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0="
- },
- "stream-to-array": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz",
- "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=",
- "requires": {
- "any-promise": "^1.1.0"
- }
- },
- "stream-to-buffer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz",
- "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=",
- "requires": {
- "stream-to": "~0.2.0"
- }
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
- },
- "strip-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
- "dev": true,
- "requires": {
- "get-stdin": "^4.0.1"
- }
- },
- "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
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "table": {
- "version": "6.0.7",
- "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
- "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
- "dev": true,
- "requires": {
- "ajv": "^7.0.2",
- "lodash": "^4.17.20",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.0"
- },
- "dependencies": {
- "ajv": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz",
- "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
- "dev": true
- },
- "timm": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
- "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw=="
- },
- "tinify": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/tinify/-/tinify-1.5.0.tgz",
- "integrity": "sha1-a6LqfognyEXSY947RvTbe61VWSA=",
- "requires": {
- "promise-nodeify": ">= 0.1",
- "proxying-agent": ">= 2.1"
- }
- },
- "tinycolor2": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
- "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
- },
- "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,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "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
- },
- "trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
- "dev": true
- },
- "ts-node": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
- "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
- "dev": true,
- "requires": {
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- }
- },
- "ts-node-dev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.1.tgz",
- "integrity": "sha512-kAO8LUZgXZSY0+PucMPsQ0Bbdv0x+lgbN7j8gcD4PuTI4uKC6YchekaspmYTBNilkiu+rQYkWJA7cK+Q8/B0tQ==",
- "dev": true,
- "requires": {
- "chokidar": "^3.4.0",
- "dateformat": "~1.0.4-1.2.3",
- "dynamic-dedupe": "^0.3.0",
- "minimist": "^1.2.5",
- "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": "^9.0.0",
- "tsconfig": "^7.0.0"
- },
- "dependencies": {
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "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,
- "requires": {
- "@types/strip-bom": "^3.0.0",
- "@types/strip-json-comments": "0.0.30",
- "strip-bom": "^3.0.0",
- "strip-json-comments": "^2.0.0"
- },
- "dependencies": {
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
- }
- }
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "tsutils": {
- "version": "3.20.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz",
- "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==",
- "dev": true,
- "requires": {
- "tslib": "^1.8.1"
- }
- },
- "tsyringe": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.4.0.tgz",
- "integrity": "sha512-SlMApe1lhIq546CDp7bF+IdF4RB6d+9C5T7B0AS0P/Bm+Qpizj/gEmZzvw9J/KlXPEt4qHTbi1TRvX3rCPSdTg==",
- "requires": {
- "tslib": "^1.9.3"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "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,
- "requires": {
- "prelude-ls": "^1.2.1"
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- },
- "typescript": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz",
- "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==",
- "dev": true
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "url-regex": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz",
- "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=",
- "requires": {
- "ip-regex": "^1.0.1"
- }
- },
- "utif": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
- "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
- "requires": {
- "pako": "^1.0.5"
- },
- "dependencies": {
- "pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
- },
- "v8-compile-cache": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
- "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
- "dev": true
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
- "requires": {
- "defaults": "^1.0.3"
- }
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "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
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "xhr": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
- "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
- "requires": {
- "global": "~4.4.0",
- "is-function": "^1.0.1",
- "parse-headers": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
- "xml-parse-from-string": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
- "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig="
- },
- "xml2js": {
- "version": "0.4.23",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
- "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- }
- },
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true
- }
- }
-}
diff --git a/package.json b/package.json
index 46b55de..8de433d 100644
--- a/package.json
+++ b/package.json
@@ -1,25 +1,36 @@
{
- "name": "nitro-converter",
+ "name": "@nitrots/nitro-converter",
+ "description": "Serverside javascript library for bundling .nitro assets",
"version": "1.0.0",
- "description": "",
- "main": "index.js",
- "scripts": {
- "start": "ts-node-transpile-only src/Main.ts",
- "start:dev": "ts-node-dev --respawn --transpile-only src/Main.ts"
+ "publishConfig": {
+ "access": "public"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://git.krews.org/nitro/nitro-converter.git"
+ },
+ "license": "GPL-3.0",
+ "bugs": {
+ "url": "https://git.krews.org/nitro/nitro-converter/issues"
+ },
+ "homepage": "https://git.krews.org/nitro/nitro-converter",
+ "scripts": {
+ "build": "tsc",
+ "start:dev": "ts-node-dev --respawn --transpile-only src/Main.ts",
+ "start": "yarn start:dev",
+ "start:bundle": "yarn start --bundle",
+ "start:extract": "yarn start --extract",
+ "start:convert-swf": "yarn start --convert-swf"
},
- "author": "",
- "license": "ISC",
"dependencies": {
"bytebuffer": "^5.0.1",
"concat-frames": "^1.0.3",
"free-tex-packer-core": "^0.3.2",
- "jimp": "^0.16.1",
"jpg-stream": "^1.1.2",
- "lodash": "^4.17.20",
"lzma-purejs": "^0.9.3",
"node-fetch": "^2.6.1",
- "node-gzip": "^1.1.2",
"ora": "^5.3.0",
+ "pako": "^2.0.4",
"png-stream": "^1.0.5",
"reflect-metadata": "^0.1.13",
"stream-to-array": "^2.3.0",
@@ -30,6 +41,8 @@
"@types/bytebuffer": "^5.0.42",
"@types/node": "^14.14.28",
"@types/node-fetch": "^2.5.8",
+ "@types/pako": "^1.0.2",
+ "@types/stream-to-array": "^2.3.0",
"@types/xml2js": "^0.4.8",
"@typescript-eslint/eslint-plugin": "^4.15.1",
"@typescript-eslint/parser": "^4.15.1",
diff --git a/src/Main.ts b/src/Main.ts
index 60be08c..083f068 100644
--- a/src/Main.ts
+++ b/src/Main.ts
@@ -2,22 +2,16 @@ import 'reflect-metadata';
import { container } from 'tsyringe';
import { Configuration } from './common/config/Configuration';
import { IConverter } from './common/converters/IConverter';
-import { EffectConverter } from './converters/EffectConverter';
+import { ConverterUtilities } from './converters/ConverterUtilities';
import { EffectMapConverter } from './converters/EffectMapConverter';
import { ExternalTextsConverter } from './converters/ExternalTextsConverter';
-import { FigureConverter } from './converters/FigureConverter';
import { FigureDataConverter } from './converters/FigureDataConverter';
import { FigureMapConverter } from './converters/FigureMapConverter';
-import { FurnitureConverter } from './converters/FurnitureConverter';
import { FurnitureDataConverter } from './converters/FurnitureDataConverter';
-import { OldAssetConverter } from './converters/OldAssetConverter';
-import { PetConverter } from './converters/PetConverter';
import { ProductDataConverter } from './converters/ProductDataConverter';
(async () =>
{
- checkNodeVersion();
-
const config = container.resolve(Configuration);
await config.init();
@@ -27,30 +21,35 @@ import { ProductDataConverter } from './converters/ProductDataConverter';
ProductDataConverter,
ExternalTextsConverter,
EffectMapConverter,
- FigureMapConverter,
- FurnitureConverter,
- FigureConverter,
- EffectConverter,
- PetConverter,
- OldAssetConverter
+ FigureMapConverter
];
- const [ arg1, arg2, ...rest ] = process.argv;
+ const bundle = (process.argv.indexOf('--bundle') >= 0);
+ const extract = (process.argv.indexOf('--extract') >= 0);
+ const convertSwf = (process.argv.indexOf('--convert-swf') >= 0);
+ const skip = (bundle || extract || convertSwf);
+
+ if(skip)
+ {
+ const extractor = container.resolve(ConverterUtilities);
+
+ bundle && await extractor.bundleExtractedFromFolder();
+ extract && await extractor.extractNitroFromFolder();
+ convertSwf && await extractor.convertSwfFromFolder();
+
+ process.exit();
+ }
for(const converterClass of converters)
{
const converter = (container.resolve(converterClass) as IConverter);
- await converter.convertAsync(rest);
+ await converter.convertAsync();
}
-})();
-function checkNodeVersion()
-{
- const version = process.version.replace('v', '');
- const major = version.split('.')[0];
- if(parseInt(major) < 14)
- {
- throw new Error('Invalid node version: ' + version + ' please use >= 14');
- }
-}
+ const utilities = container.resolve(ConverterUtilities);
+
+ await utilities.downloadSwfTypes();
+
+ process.exit();
+})();
diff --git a/src/common/SWFDownloader.ts b/src/common/SWFDownloader.ts
deleted file mode 100644
index 5d9e345..0000000
--- a/src/common/SWFDownloader.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { HabboAssetSWF } from '../swf/HabboAssetSWF';
-import { FileUtilities } from '../utils/FileUtilities';
-
-export class SWFDownloader
-{
- public static USES_REVISION: boolean = true;
- public static LOG_DOWNLOADS: boolean = true;
-
- public static async download(baseUrl: string, className: string, revision: number): Promise
- {
- let url = baseUrl;
-
- if(!url || !url.length) return;
-
- if(SWFDownloader.USES_REVISION && (revision > -1)) url = url.replace('%revision%', revision.toString());
-
- url = url.replace('%className%', className);
-
- if(SWFDownloader.LOG_DOWNLOADS)
- {
- console.log();
- console.log(` Downloading ${ className } from ${url}`);
- }
-
- const habboAssetSWF = await this.extractSWF(url);
-
- if(!habboAssetSWF) return null;
-
- return habboAssetSWF;
- }
-
- public static async downloadFromUrl(url: string, className: string, revision: number): Promise
- {
- if(SWFDownloader.LOG_DOWNLOADS)
- {
- console.log();
- console.log(` Downloading ${ className } from ${url}`);
- }
-
- const habboAssetSWF = await this.extractSWF(url);
-
- if(!habboAssetSWF) return null;
-
- return habboAssetSWF;
- }
-
- public static async extractSWF(url: string): Promise
- {
- const buffer = await FileUtilities.readFileAsBuffer(url);
-
- if(!buffer) return null;
-
- const habboAssetSWF = new HabboAssetSWF(buffer);
-
- await habboAssetSWF.setupAsync();
-
- return habboAssetSWF;
- }
-}
diff --git a/src/common/bundle/BundleProvider.ts b/src/common/bundle/BundleProvider.ts
deleted file mode 100644
index 8f57cbb..0000000
--- a/src/common/bundle/BundleProvider.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { packAsync } from 'free-tex-packer-core';
-import { HabboAssetSWF } from '../../swf/HabboAssetSWF';
-import { ImageBundle } from './ImageBundle';
-import { SpriteBundle } from './SpriteBundle';
-
-export class BundleProvider
-{
- public static imageSource: Map = new Map();
-
- public static async generateSpriteSheet(habboAssetSWF: HabboAssetSWF, convertCase: boolean = false): Promise
- {
- const tagList = habboAssetSWF.symbolTags();
- const names: string[] = [];
- const tags: number[] = [];
-
- let documentClass = habboAssetSWF.getDocumentClass();
-
- if(convertCase) documentClass = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, ''))));
-
- for(const tag of tagList)
- {
- names.push(...tag.names);
- tags.push(...tag.tags);
- }
-
- const imageBundle = new ImageBundle();
-
- const imageTags = habboAssetSWF.imageTags();
-
- for(const imageTag of imageTags)
- {
- if(tags.includes(imageTag.characterID))
- {
- for(let i = 0; i < tags.length; i++)
- {
- if(tags[i] != imageTag.characterID) continue;
-
- if(names[i] == imageTag.className) continue;
-
- if(imageTag.className.startsWith('sh_')) continue;
-
- if(imageTag.className.indexOf('_32_') >= 0) continue;
-
- BundleProvider.imageSource.set(names[i].substring(documentClass.length + 1), imageTag.className.substring(documentClass.length + 1));
- }
- }
-
- if(imageTag.className.startsWith('sh_')) continue;
-
- if(imageTag.className.indexOf('_32_') >= 0) continue;
-
- let className = imageTag.className;
-
- if(convertCase) className = ((className.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1));
-
- imageBundle.addImage(className, imageTag.imgData);
- }
-
- if(!imageBundle.images.length) return null;
-
- return await this.packImages(documentClass, imageBundle, convertCase);
- }
-
- private static async packImages(documentClass: string, imageBundle: ImageBundle, convertCase: boolean = false): Promise
- {
- const files = await packAsync(imageBundle.images, {
- textureName: (convertCase ? documentClass.substring(1) : documentClass),
- width: 10240,
- height: 4320,
- fixedSize: false,
- allowRotation: false,
- detectIdentical: true,
- allowTrim: true,
- //@ts-ignore
- exporter: 'Pixi'
- });
-
- const bundle = new SpriteBundle();
-
- for(const item of files)
- {
- if(item.name.endsWith('.json'))
- {
- bundle.spritesheet = JSON.parse(item.buffer.toString('utf8'));
-
- delete bundle.spritesheet.meta.app;
- delete bundle.spritesheet.meta.version;
- }
- else
- {
- bundle.imageData = {
- name: item.name,
- buffer: item.buffer
- };
-
- if(convertCase) bundle.imageData.name = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1);
- }
- }
-
- if((bundle.spritesheet !== undefined) && (bundle.imageData !== undefined)) bundle.spritesheet.meta.image = bundle.imageData.name;
-
- return bundle;
- }
-}
diff --git a/src/common/bundle/NitroBundle.ts b/src/common/bundle/NitroBundle.ts
new file mode 100644
index 0000000..2ea51fc
--- /dev/null
+++ b/src/common/bundle/NitroBundle.ts
@@ -0,0 +1,75 @@
+import ByteBuffer from 'bytebuffer';
+import { Data, deflate, inflate } from 'pako';
+import { BinaryReader } from '../utils';
+
+export class NitroBundle
+{
+ private readonly _files: Map;
+
+ constructor()
+ {
+ this._files = new Map();
+ }
+
+ public static from(buffer: ArrayBuffer): NitroBundle
+ {
+ const nitroBundle = new NitroBundle();
+ const binaryReader = new BinaryReader(buffer);
+
+ let fileCount = binaryReader.readShort();
+
+ while(fileCount > 0)
+ {
+ const fileNameLength = binaryReader.readShort();
+ const fileName = binaryReader.readBytes(fileNameLength).toString();
+ const fileLength = binaryReader.readInt();
+ const buffer = binaryReader.readBytes(fileLength);
+ const decompressed = inflate((buffer.toArrayBuffer() as Data));
+
+ nitroBundle.addFile(fileName, Buffer.from(decompressed.buffer));
+
+ fileCount--;
+ }
+
+ return nitroBundle;
+ }
+
+ public addFile(name: string, data: Buffer): void
+ {
+ this._files.set(name, data);
+ }
+
+ public async toBufferAsync(): Promise
+ {
+ const buffer = new ByteBuffer();
+
+ buffer.writeUint16(this._files.size);
+
+ for(const file of this._files.entries())
+ {
+ const fileName = file[0];
+ const fileBuffer = file[1];
+
+ buffer.writeUint16(fileName.length);
+ buffer.writeString(fileName);
+
+ const compressed = deflate(fileBuffer);
+ buffer.writeUint32(compressed.length);
+ buffer.append(compressed);
+ }
+
+ buffer.flip();
+
+ return buffer.toBuffer();
+ }
+
+ public get files(): Map
+ {
+ return this._files;
+ }
+
+ public get totalFiles(): number
+ {
+ return this._files.size;
+ }
+}
diff --git a/src/common/bundle/SpriteBundle.ts b/src/common/bundle/SpriteBundle.ts
index f058f60..b39a026 100644
--- a/src/common/bundle/SpriteBundle.ts
+++ b/src/common/bundle/SpriteBundle.ts
@@ -1,4 +1,4 @@
-import { ISpritesheetData } from '../../mapping/json';
+import { ISpritesheetData } from '../mapping';
export class SpriteBundle
{
diff --git a/src/common/bundle/index.ts b/src/common/bundle/index.ts
new file mode 100644
index 0000000..d0e332d
--- /dev/null
+++ b/src/common/bundle/index.ts
@@ -0,0 +1,3 @@
+export * from './ImageBundle';
+export * from './NitroBundle';
+export * from './SpriteBundle';
diff --git a/src/common/config/Configuration.ts b/src/common/config/Configuration.ts
index e291943..11ec41b 100644
--- a/src/common/config/Configuration.ts
+++ b/src/common/config/Configuration.ts
@@ -1,6 +1,6 @@
import { singleton } from 'tsyringe';
import * as configuration from '../../configuration.json';
-import { FileUtilities } from '../../utils/FileUtilities';
+import { FileUtilities } from '../utils';
@singleton()
export class Configuration
@@ -101,6 +101,7 @@ export class Configuration
public interpolate(value: string, regex: RegExp = null): string
{
+ if(!value || (typeof value === 'object')) return value;
if(!regex) regex = new RegExp(/\${(.*?)}/g);
const pieces = value.match(regex);
diff --git a/src/common/config/index.ts b/src/common/config/index.ts
new file mode 100644
index 0000000..a699b40
--- /dev/null
+++ b/src/common/config/index.ts
@@ -0,0 +1 @@
+export * from './Configuration';
diff --git a/src/common/converters/Converter.ts b/src/common/converters/Converter.ts
deleted file mode 100644
index 0ce6736..0000000
--- a/src/common/converters/Converter.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { IConverter } from './IConverter';
-
-export class Converter implements IConverter
-{
- public async convertAsync(args: string[] = []): Promise
- {
- return;
- }
-}
diff --git a/src/common/converters/ConverterResult.ts b/src/common/converters/ConverterResult.ts
new file mode 100644
index 0000000..6a968a3
--- /dev/null
+++ b/src/common/converters/ConverterResult.ts
@@ -0,0 +1,7 @@
+export class ConverterResult
+{
+ public static OK: number = 1;
+ public static BAD_ARGS: number = 2;
+ public static FILE_EXISTS: number = 3;
+ public static INVALID_SWF: number = 4;
+}
diff --git a/src/common/converters/ConverterType.ts b/src/common/converters/ConverterType.ts
deleted file mode 100644
index 2b744fa..0000000
--- a/src/common/converters/ConverterType.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export class ConverterType
-{
- public static EFFECT_CONVERTER: string = 'effect';
- public static FIGURE_CONVERTER: string = 'figure';
- public static FURNITURE_CONVERTER: string = 'furni';
- public static PET_CONVERTER: string = 'pet';
-}
diff --git a/src/common/converters/IConverter.ts b/src/common/converters/IConverter.ts
index 3041112..7375373 100644
--- a/src/common/converters/IConverter.ts
+++ b/src/common/converters/IConverter.ts
@@ -1,4 +1,4 @@
export interface IConverter
{
- convertAsync(args?: string[]): Promise;
+ convertAsync(): Promise;
}
diff --git a/src/common/converters/index.ts b/src/common/converters/index.ts
new file mode 100644
index 0000000..73109e9
--- /dev/null
+++ b/src/common/converters/index.ts
@@ -0,0 +1,2 @@
+export * from './ConverterResult';
+export * from './IConverter';
diff --git a/src/common/index.ts b/src/common/index.ts
new file mode 100644
index 0000000..10e7235
--- /dev/null
+++ b/src/common/index.ts
@@ -0,0 +1,40 @@
+export * from './bundle';
+export * from './config';
+export * from './converters';
+export * from './mapping';
+export * from './mapping/json';
+export * from './mapping/json/asset';
+export * from './mapping/json/asset/animation';
+export * from './mapping/json/asset/logic';
+export * from './mapping/json/asset/logic/model';
+export * from './mapping/json/asset/logic/particlesystem';
+export * from './mapping/json/asset/spritesheet';
+export * from './mapping/json/asset/visualization';
+export * from './mapping/json/asset/visualization/animation';
+export * from './mapping/json/asset/visualization/color';
+export * from './mapping/json/asset/visualization/gestures';
+export * from './mapping/json/asset/visualization/postures';
+export * from './mapping/json/effectmap';
+export * from './mapping/json/externaltexts';
+export * from './mapping/json/figuredata';
+export * from './mapping/json/figuremap';
+export * from './mapping/json/furnituredata';
+export * from './mapping/json/productdata';
+export * from './mapping/mappers';
+export * from './mapping/mappers/asset';
+export * from './mapping/xml';
+export * from './mapping/xml/asset';
+export * from './mapping/xml/asset/animation';
+export * from './mapping/xml/asset/assets';
+export * from './mapping/xml/asset/logic';
+export * from './mapping/xml/asset/logic/model';
+export * from './mapping/xml/asset/logic/particlesystem';
+export * from './mapping/xml/asset/manifest';
+export * from './mapping/xml/asset/visualization';
+export * from './mapping/xml/asset/visualization/animation';
+export * from './mapping/xml/asset/visualization/color';
+export * from './mapping/xml/effectmap';
+export * from './mapping/xml/figuredata';
+export * from './mapping/xml/figuremap';
+export * from './mapping/xml/furnituredata';
+export * from './utils';
diff --git a/src/common/mapping/index.ts b/src/common/mapping/index.ts
new file mode 100644
index 0000000..3b699b8
--- /dev/null
+++ b/src/common/mapping/index.ts
@@ -0,0 +1,35 @@
+export * from './json';
+export * from './json/asset';
+export * from './json/asset/animation';
+export * from './json/asset/logic';
+export * from './json/asset/logic/model';
+export * from './json/asset/logic/particlesystem';
+export * from './json/asset/spritesheet';
+export * from './json/asset/visualization';
+export * from './json/asset/visualization/animation';
+export * from './json/asset/visualization/color';
+export * from './json/asset/visualization/gestures';
+export * from './json/asset/visualization/postures';
+export * from './json/effectmap';
+export * from './json/externaltexts';
+export * from './json/figuredata';
+export * from './json/figuremap';
+export * from './json/furnituredata';
+export * from './json/productdata';
+export * from './mappers';
+export * from './mappers/asset';
+export * from './xml';
+export * from './xml/asset';
+export * from './xml/asset/animation';
+export * from './xml/asset/assets';
+export * from './xml/asset/logic';
+export * from './xml/asset/logic/model';
+export * from './xml/asset/logic/particlesystem';
+export * from './xml/asset/manifest';
+export * from './xml/asset/visualization';
+export * from './xml/asset/visualization/animation';
+export * from './xml/asset/visualization/color';
+export * from './xml/effectmap';
+export * from './xml/figuredata';
+export * from './xml/figuremap';
+export * from './xml/furnituredata';
diff --git a/src/mapping/json/asset/IAsset.ts b/src/common/mapping/json/asset/IAsset.ts
similarity index 100%
rename from src/mapping/json/asset/IAsset.ts
rename to src/common/mapping/json/asset/IAsset.ts
diff --git a/src/mapping/json/asset/IAssetAlias.ts b/src/common/mapping/json/asset/IAssetAlias.ts
similarity index 100%
rename from src/mapping/json/asset/IAssetAlias.ts
rename to src/common/mapping/json/asset/IAssetAlias.ts
diff --git a/src/mapping/json/asset/IAssetData.ts b/src/common/mapping/json/asset/IAssetData.ts
similarity index 100%
rename from src/mapping/json/asset/IAssetData.ts
rename to src/common/mapping/json/asset/IAssetData.ts
diff --git a/src/mapping/json/asset/IAssetPalette.ts b/src/common/mapping/json/asset/IAssetPalette.ts
similarity index 100%
rename from src/mapping/json/asset/IAssetPalette.ts
rename to src/common/mapping/json/asset/IAssetPalette.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimation.ts b/src/common/mapping/json/asset/animation/IAssetAnimation.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimation.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimation.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationAdd.ts b/src/common/mapping/json/asset/animation/IAssetAnimationAdd.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationAdd.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationAdd.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationAvatar.ts b/src/common/mapping/json/asset/animation/IAssetAnimationAvatar.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationAvatar.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationAvatar.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationDirection.ts b/src/common/mapping/json/asset/animation/IAssetAnimationDirection.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationDirection.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationDirection.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationFrame.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFrame.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationFrame.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationFrame.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationFramePart.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFramePart.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationFramePart.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationFramePart.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationOverride.ts b/src/common/mapping/json/asset/animation/IAssetAnimationOverride.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationOverride.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationOverride.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationRemove.ts b/src/common/mapping/json/asset/animation/IAssetAnimationRemove.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationRemove.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationRemove.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationShadow.ts b/src/common/mapping/json/asset/animation/IAssetAnimationShadow.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationShadow.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationShadow.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationSprite.ts b/src/common/mapping/json/asset/animation/IAssetAnimationSprite.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationSprite.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationSprite.ts
diff --git a/src/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts b/src/common/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts
similarity index 100%
rename from src/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts
rename to src/common/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts
diff --git a/src/mapping/json/asset/animation/index.ts b/src/common/mapping/json/asset/animation/index.ts
similarity index 100%
rename from src/mapping/json/asset/animation/index.ts
rename to src/common/mapping/json/asset/animation/index.ts
diff --git a/src/mapping/json/asset/index.ts b/src/common/mapping/json/asset/index.ts
similarity index 100%
rename from src/mapping/json/asset/index.ts
rename to src/common/mapping/json/asset/index.ts
diff --git a/src/mapping/json/asset/logic/IAssetLogicCustomVars.ts b/src/common/mapping/json/asset/logic/IAssetLogicCustomVars.ts
similarity index 100%
rename from src/mapping/json/asset/logic/IAssetLogicCustomVars.ts
rename to src/common/mapping/json/asset/logic/IAssetLogicCustomVars.ts
diff --git a/src/mapping/json/asset/logic/IAssetLogicData.ts b/src/common/mapping/json/asset/logic/IAssetLogicData.ts
similarity index 100%
rename from src/mapping/json/asset/logic/IAssetLogicData.ts
rename to src/common/mapping/json/asset/logic/IAssetLogicData.ts
diff --git a/src/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts b/src/common/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts
similarity index 100%
rename from src/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts
rename to src/common/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts
diff --git a/src/mapping/json/asset/logic/ISoundSample.ts b/src/common/mapping/json/asset/logic/ISoundSample.ts
similarity index 100%
rename from src/mapping/json/asset/logic/ISoundSample.ts
rename to src/common/mapping/json/asset/logic/ISoundSample.ts
diff --git a/src/mapping/json/asset/logic/index.ts b/src/common/mapping/json/asset/logic/index.ts
similarity index 100%
rename from src/mapping/json/asset/logic/index.ts
rename to src/common/mapping/json/asset/logic/index.ts
diff --git a/src/mapping/json/asset/logic/model/IAssetDimension.ts b/src/common/mapping/json/asset/logic/model/IAssetDimension.ts
similarity index 77%
rename from src/mapping/json/asset/logic/model/IAssetDimension.ts
rename to src/common/mapping/json/asset/logic/model/IAssetDimension.ts
index 4a4629f..a467a03 100644
--- a/src/mapping/json/asset/logic/model/IAssetDimension.ts
+++ b/src/common/mapping/json/asset/logic/model/IAssetDimension.ts
@@ -3,4 +3,5 @@ export interface IAssetDimension
x: number;
y: number;
z?: number;
-}
\ No newline at end of file
+ centerZ?: number;
+}
diff --git a/src/mapping/json/asset/logic/model/IAssetLogicModel.ts b/src/common/mapping/json/asset/logic/model/IAssetLogicModel.ts
similarity index 100%
rename from src/mapping/json/asset/logic/model/IAssetLogicModel.ts
rename to src/common/mapping/json/asset/logic/model/IAssetLogicModel.ts
diff --git a/src/mapping/json/asset/logic/model/index.ts b/src/common/mapping/json/asset/logic/model/index.ts
similarity index 100%
rename from src/mapping/json/asset/logic/model/index.ts
rename to src/common/mapping/json/asset/logic/model/index.ts
diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystem.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystem.ts
similarity index 100%
rename from src/mapping/json/asset/logic/particlesystem/IParticleSystem.ts
rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystem.ts
diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts
similarity index 100%
rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts
rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts
diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts
similarity index 100%
rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts
rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts
diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts
similarity index 100%
rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts
rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts
diff --git a/src/mapping/json/asset/logic/particlesystem/index.ts b/src/common/mapping/json/asset/logic/particlesystem/index.ts
similarity index 100%
rename from src/mapping/json/asset/logic/particlesystem/index.ts
rename to src/common/mapping/json/asset/logic/particlesystem/index.ts
diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetData.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetData.ts
similarity index 100%
rename from src/mapping/json/asset/spritesheet/ISpritesheetData.ts
rename to src/common/mapping/json/asset/spritesheet/ISpritesheetData.ts
diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetFrame.ts
similarity index 100%
rename from src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts
rename to src/common/mapping/json/asset/spritesheet/ISpritesheetFrame.ts
diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetMeta.ts
similarity index 100%
rename from src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts
rename to src/common/mapping/json/asset/spritesheet/ISpritesheetMeta.ts
diff --git a/src/mapping/json/asset/spritesheet/index.ts b/src/common/mapping/json/asset/spritesheet/index.ts
similarity index 100%
rename from src/mapping/json/asset/spritesheet/index.ts
rename to src/common/mapping/json/asset/spritesheet/index.ts
diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationData.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationData.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/IAssetVisualizationData.ts
rename to src/common/mapping/json/asset/visualization/IAssetVisualizationData.ts
diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationDirection.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts
rename to src/common/mapping/json/asset/visualization/IAssetVisualizationDirection.ts
diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationLayer.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts
rename to src/common/mapping/json/asset/visualization/IAssetVisualizationLayer.ts
diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts
rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts
diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts
rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts
diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts
rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts
diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts
rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts
diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts
rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts
diff --git a/src/mapping/json/asset/visualization/animation/index.ts b/src/common/mapping/json/asset/visualization/animation/index.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/animation/index.ts
rename to src/common/mapping/json/asset/visualization/animation/index.ts
diff --git a/src/mapping/json/asset/visualization/color/IAssetColor.ts b/src/common/mapping/json/asset/visualization/color/IAssetColor.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/color/IAssetColor.ts
rename to src/common/mapping/json/asset/visualization/color/IAssetColor.ts
diff --git a/src/mapping/json/asset/visualization/color/IAssetColorLayer.ts b/src/common/mapping/json/asset/visualization/color/IAssetColorLayer.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/color/IAssetColorLayer.ts
rename to src/common/mapping/json/asset/visualization/color/IAssetColorLayer.ts
diff --git a/src/mapping/json/asset/visualization/color/index.ts b/src/common/mapping/json/asset/visualization/color/index.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/color/index.ts
rename to src/common/mapping/json/asset/visualization/color/index.ts
diff --git a/src/mapping/json/asset/visualization/gestures/IAssetGesture.ts b/src/common/mapping/json/asset/visualization/gestures/IAssetGesture.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/gestures/IAssetGesture.ts
rename to src/common/mapping/json/asset/visualization/gestures/IAssetGesture.ts
diff --git a/src/mapping/json/asset/visualization/gestures/index.ts b/src/common/mapping/json/asset/visualization/gestures/index.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/gestures/index.ts
rename to src/common/mapping/json/asset/visualization/gestures/index.ts
diff --git a/src/mapping/json/asset/visualization/index.ts b/src/common/mapping/json/asset/visualization/index.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/index.ts
rename to src/common/mapping/json/asset/visualization/index.ts
diff --git a/src/mapping/json/asset/visualization/postures/IAssetPosture.ts b/src/common/mapping/json/asset/visualization/postures/IAssetPosture.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/postures/IAssetPosture.ts
rename to src/common/mapping/json/asset/visualization/postures/IAssetPosture.ts
diff --git a/src/mapping/json/asset/visualization/postures/index.ts b/src/common/mapping/json/asset/visualization/postures/index.ts
similarity index 100%
rename from src/mapping/json/asset/visualization/postures/index.ts
rename to src/common/mapping/json/asset/visualization/postures/index.ts
diff --git a/src/mapping/json/effectmap/IEffectMap.ts b/src/common/mapping/json/effectmap/IEffectMap.ts
similarity index 100%
rename from src/mapping/json/effectmap/IEffectMap.ts
rename to src/common/mapping/json/effectmap/IEffectMap.ts
diff --git a/src/mapping/json/effectmap/IEffectMapLibrary.ts b/src/common/mapping/json/effectmap/IEffectMapLibrary.ts
similarity index 100%
rename from src/mapping/json/effectmap/IEffectMapLibrary.ts
rename to src/common/mapping/json/effectmap/IEffectMapLibrary.ts
diff --git a/src/mapping/json/effectmap/index.ts b/src/common/mapping/json/effectmap/index.ts
similarity index 100%
rename from src/mapping/json/effectmap/index.ts
rename to src/common/mapping/json/effectmap/index.ts
diff --git a/src/mapping/json/externaltexts/IExternalTexts.ts b/src/common/mapping/json/externaltexts/IExternalTexts.ts
similarity index 100%
rename from src/mapping/json/externaltexts/IExternalTexts.ts
rename to src/common/mapping/json/externaltexts/IExternalTexts.ts
diff --git a/src/mapping/json/externaltexts/index.ts b/src/common/mapping/json/externaltexts/index.ts
similarity index 100%
rename from src/mapping/json/externaltexts/index.ts
rename to src/common/mapping/json/externaltexts/index.ts
diff --git a/src/mapping/json/figuredata/IFigureData.ts b/src/common/mapping/json/figuredata/IFigureData.ts
similarity index 100%
rename from src/mapping/json/figuredata/IFigureData.ts
rename to src/common/mapping/json/figuredata/IFigureData.ts
diff --git a/src/mapping/json/figuredata/IFigureDataColor.ts b/src/common/mapping/json/figuredata/IFigureDataColor.ts
similarity index 100%
rename from src/mapping/json/figuredata/IFigureDataColor.ts
rename to src/common/mapping/json/figuredata/IFigureDataColor.ts
diff --git a/src/mapping/json/figuredata/IFigureDataHiddenLayer.ts b/src/common/mapping/json/figuredata/IFigureDataHiddenLayer.ts
similarity index 100%
rename from src/mapping/json/figuredata/IFigureDataHiddenLayer.ts
rename to src/common/mapping/json/figuredata/IFigureDataHiddenLayer.ts
diff --git a/src/mapping/json/figuredata/IFigureDataPalette.ts b/src/common/mapping/json/figuredata/IFigureDataPalette.ts
similarity index 100%
rename from src/mapping/json/figuredata/IFigureDataPalette.ts
rename to src/common/mapping/json/figuredata/IFigureDataPalette.ts
diff --git a/src/mapping/json/figuredata/IFigureDataPart.ts b/src/common/mapping/json/figuredata/IFigureDataPart.ts
similarity index 100%
rename from src/mapping/json/figuredata/IFigureDataPart.ts
rename to src/common/mapping/json/figuredata/IFigureDataPart.ts
diff --git a/src/mapping/json/figuredata/IFigureDataSet.ts b/src/common/mapping/json/figuredata/IFigureDataSet.ts
similarity index 100%
rename from src/mapping/json/figuredata/IFigureDataSet.ts
rename to src/common/mapping/json/figuredata/IFigureDataSet.ts
diff --git a/src/mapping/json/figuredata/IFigureDataSetType.ts b/src/common/mapping/json/figuredata/IFigureDataSetType.ts
similarity index 100%
rename from src/mapping/json/figuredata/IFigureDataSetType.ts
rename to src/common/mapping/json/figuredata/IFigureDataSetType.ts
diff --git a/src/mapping/json/figuredata/index.ts b/src/common/mapping/json/figuredata/index.ts
similarity index 100%
rename from src/mapping/json/figuredata/index.ts
rename to src/common/mapping/json/figuredata/index.ts
diff --git a/src/mapping/json/figuremap/IFigureMap.ts b/src/common/mapping/json/figuremap/IFigureMap.ts
similarity index 100%
rename from src/mapping/json/figuremap/IFigureMap.ts
rename to src/common/mapping/json/figuremap/IFigureMap.ts
diff --git a/src/mapping/json/figuremap/IFigureMapLibrary.ts b/src/common/mapping/json/figuremap/IFigureMapLibrary.ts
similarity index 100%
rename from src/mapping/json/figuremap/IFigureMapLibrary.ts
rename to src/common/mapping/json/figuremap/IFigureMapLibrary.ts
diff --git a/src/mapping/json/figuremap/IFigureMapLibraryPart.ts b/src/common/mapping/json/figuremap/IFigureMapLibraryPart.ts
similarity index 100%
rename from src/mapping/json/figuremap/IFigureMapLibraryPart.ts
rename to src/common/mapping/json/figuremap/IFigureMapLibraryPart.ts
diff --git a/src/mapping/json/figuremap/index.ts b/src/common/mapping/json/figuremap/index.ts
similarity index 100%
rename from src/mapping/json/figuremap/index.ts
rename to src/common/mapping/json/figuremap/index.ts
diff --git a/src/mapping/json/furnituredata/IFurnitureData.ts b/src/common/mapping/json/furnituredata/IFurnitureData.ts
similarity index 100%
rename from src/mapping/json/furnituredata/IFurnitureData.ts
rename to src/common/mapping/json/furnituredata/IFurnitureData.ts
diff --git a/src/mapping/json/furnituredata/IFurnitureType.ts b/src/common/mapping/json/furnituredata/IFurnitureType.ts
similarity index 100%
rename from src/mapping/json/furnituredata/IFurnitureType.ts
rename to src/common/mapping/json/furnituredata/IFurnitureType.ts
diff --git a/src/mapping/json/furnituredata/index.ts b/src/common/mapping/json/furnituredata/index.ts
similarity index 100%
rename from src/mapping/json/furnituredata/index.ts
rename to src/common/mapping/json/furnituredata/index.ts
diff --git a/src/mapping/json/index.ts b/src/common/mapping/json/index.ts
similarity index 100%
rename from src/mapping/json/index.ts
rename to src/common/mapping/json/index.ts
diff --git a/src/mapping/json/productdata/IProductData.ts b/src/common/mapping/json/productdata/IProductData.ts
similarity index 100%
rename from src/mapping/json/productdata/IProductData.ts
rename to src/common/mapping/json/productdata/IProductData.ts
diff --git a/src/mapping/json/productdata/IProductType.ts b/src/common/mapping/json/productdata/IProductType.ts
similarity index 100%
rename from src/mapping/json/productdata/IProductType.ts
rename to src/common/mapping/json/productdata/IProductType.ts
diff --git a/src/mapping/json/productdata/index.ts b/src/common/mapping/json/productdata/index.ts
similarity index 100%
rename from src/mapping/json/productdata/index.ts
rename to src/common/mapping/json/productdata/index.ts
diff --git a/src/mapping/mappers/EffectMapMapper.ts b/src/common/mapping/mappers/EffectMapMapper.ts
similarity index 97%
rename from src/mapping/mappers/EffectMapMapper.ts
rename to src/common/mapping/mappers/EffectMapMapper.ts
index 712b69b..dea07a1 100644
--- a/src/mapping/mappers/EffectMapMapper.ts
+++ b/src/common/mapping/mappers/EffectMapMapper.ts
@@ -1,6 +1,6 @@
import { IEffectMap, IEffectMapLibrary } from '../json';
import { EffectMapEffectXML, EffectMapXML } from '../xml';
-import { Mapper } from './asset/Mapper';
+import { Mapper } from './asset';
export class EffectMapMapper extends Mapper
{
diff --git a/src/mapping/mappers/FigureDataMapper.ts b/src/common/mapping/mappers/FigureDataMapper.ts
similarity index 85%
rename from src/mapping/mappers/FigureDataMapper.ts
rename to src/common/mapping/mappers/FigureDataMapper.ts
index 8b50a40..71c2627 100644
--- a/src/mapping/mappers/FigureDataMapper.ts
+++ b/src/common/mapping/mappers/FigureDataMapper.ts
@@ -1,18 +1,6 @@
-import { IFigureDataHiddenLayer } from '../json';
-import { IFigureDataPalette } from '../json/figuredata/IFigureDataPalette';
-import { IFigureDataSet } from '../json/figuredata/IFigureDataSet';
-import { FigureDataHiddenLayerXML } from '../xml';
-import { FigureDataColorXML } from '../xml/figuredata/FigureDataColorXML';
-import { FigureDataPaletteXML } from '../xml/figuredata/FigureDataPaletteXML';
-import { FigureDataXML } from '../xml/figuredata/FigureDataXML';
-import { IFigureData } from './../json/figuredata/IFigureData';
-import { IFigureDataColor } from './../json/figuredata/IFigureDataColor';
-import { IFigureDataPart } from './../json/figuredata/IFigureDataPart';
-import { IFigureDataSetType } from './../json/figuredata/IFigureDataSetType';
-import { FigureDataPartXML } from './../xml/figuredata/FigureDataPartXML';
-import { FigureDataSetTypeXML } from './../xml/figuredata/FigureDataSetTypeXML';
-import { FigureDataSetXML } from './../xml/figuredata/FigureDataSetXML';
-import { Mapper } from './asset/Mapper';
+import { IFigureData, IFigureDataColor, IFigureDataHiddenLayer, IFigureDataPalette, IFigureDataPart, IFigureDataSet, IFigureDataSetType } from '../json';
+import { FigureDataColorXML, FigureDataHiddenLayerXML, FigureDataPaletteXML, FigureDataPartXML, FigureDataSetTypeXML, FigureDataSetXML, FigureDataXML } from '../xml';
+import { Mapper } from './asset';
export class FigureDataMapper extends Mapper
{
diff --git a/src/mapping/mappers/FigureMapMapper.ts b/src/common/mapping/mappers/FigureMapMapper.ts
similarity index 98%
rename from src/mapping/mappers/FigureMapMapper.ts
rename to src/common/mapping/mappers/FigureMapMapper.ts
index 5c7e8e7..daa8bc9 100644
--- a/src/mapping/mappers/FigureMapMapper.ts
+++ b/src/common/mapping/mappers/FigureMapMapper.ts
@@ -1,6 +1,6 @@
import { IFigureMap, IFigureMapLibrary, IFigureMapLibraryPart } from '../json';
import { FigureLibraryPartXML, FigureLibraryXML, FigureMapXML } from '../xml';
-import { Mapper } from './asset/Mapper';
+import { Mapper } from './asset';
export class FigureMapMapper extends Mapper
{
diff --git a/src/mapping/mappers/FurnitureDataMapper.ts b/src/common/mapping/mappers/FurnitureDataMapper.ts
similarity index 98%
rename from src/mapping/mappers/FurnitureDataMapper.ts
rename to src/common/mapping/mappers/FurnitureDataMapper.ts
index 2a45c40..5387840 100644
--- a/src/mapping/mappers/FurnitureDataMapper.ts
+++ b/src/common/mapping/mappers/FurnitureDataMapper.ts
@@ -1,6 +1,6 @@
import { IFurnitureData, IFurnitureType } from '../json';
import { FurnitureDataXML, FurnitureTypeXML } from '../xml';
-import { Mapper } from './asset/Mapper';
+import { Mapper } from './asset';
export class FurnitureDataMapper extends Mapper
{
diff --git a/src/mapping/mappers/asset/AnimationMapper.ts b/src/common/mapping/mappers/asset/AnimationMapper.ts
similarity index 100%
rename from src/mapping/mappers/asset/AnimationMapper.ts
rename to src/common/mapping/mappers/asset/AnimationMapper.ts
diff --git a/src/mapping/mappers/asset/AssetMapper.ts b/src/common/mapping/mappers/asset/AssetMapper.ts
similarity index 89%
rename from src/mapping/mappers/asset/AssetMapper.ts
rename to src/common/mapping/mappers/asset/AssetMapper.ts
index 4ebc586..f889ac4 100644
--- a/src/mapping/mappers/asset/AssetMapper.ts
+++ b/src/common/mapping/mappers/asset/AssetMapper.ts
@@ -1,4 +1,4 @@
-import { BundleProvider } from '../../../common/bundle/BundleProvider';
+import { IMAGE_SOURCES } from '../../../../swf';
import { IAsset, IAssetData, IAssetPalette } from '../../json';
import { AssetsXML, AssetXML, PaletteXML } from '../../xml';
import { Mapper } from './Mapper';
@@ -55,12 +55,12 @@ export class AssetMapper extends Mapper
{
asset.source = assetXML.source;
- if(BundleProvider.imageSource.has(assetXML.source)) asset.source = BundleProvider.imageSource.get(assetXML.source) as string;
+ if(IMAGE_SOURCES.has(assetXML.source)) asset.source = IMAGE_SOURCES.get(assetXML.source) as string;
}
if(assetXML.name !== undefined)
{
- if(BundleProvider.imageSource.has(assetXML.name)) asset.source = BundleProvider.imageSource.get(assetXML.name) as string;
+ if(IMAGE_SOURCES.has(assetXML.name)) asset.source = IMAGE_SOURCES.get(assetXML.name) as string;
}
if(assetXML.x !== undefined) asset.x = assetXML.x;
diff --git a/src/mapping/mappers/asset/IndexMapper.ts b/src/common/mapping/mappers/asset/IndexMapper.ts
similarity index 100%
rename from src/mapping/mappers/asset/IndexMapper.ts
rename to src/common/mapping/mappers/asset/IndexMapper.ts
diff --git a/src/mapping/mappers/asset/LogicMapper.ts b/src/common/mapping/mappers/asset/LogicMapper.ts
similarity index 96%
rename from src/mapping/mappers/asset/LogicMapper.ts
rename to src/common/mapping/mappers/asset/LogicMapper.ts
index 8d29529..ff3f6cf 100644
--- a/src/mapping/mappers/asset/LogicMapper.ts
+++ b/src/common/mapping/mappers/asset/LogicMapper.ts
@@ -25,9 +25,12 @@ export class LogicMapper extends Mapper
{
output.model.dimensions = {
x: xml.model.dimensions.x,
- y: xml.model.dimensions.y,
- z: xml.model.dimensions.z
+ y: xml.model.dimensions.y
};
+
+ if(xml.model.dimensions.z !== undefined) output.model.dimensions.z = xml.model.dimensions.z;
+
+ if(xml.model.dimensions.centerZ !== undefined) output.model.dimensions.centerZ = xml.model.dimensions.centerZ;
}
if(xml.model.directions !== undefined)
diff --git a/src/mapping/mappers/asset/ManifestMapper.ts b/src/common/mapping/mappers/asset/ManifestMapper.ts
similarity index 93%
rename from src/mapping/mappers/asset/ManifestMapper.ts
rename to src/common/mapping/mappers/asset/ManifestMapper.ts
index bd26d3a..afc4cd7 100644
--- a/src/mapping/mappers/asset/ManifestMapper.ts
+++ b/src/common/mapping/mappers/asset/ManifestMapper.ts
@@ -1,4 +1,4 @@
-import { BundleProvider } from '../../../common/bundle/BundleProvider';
+import { IMAGE_SOURCES } from '../../../../swf';
import { IAsset, IAssetAlias, IAssetData } from '../../json';
import { ManifestLibraryAliasXML, ManifestLibraryAssetParamXML, ManifestLibraryAssetXML, ManifestLibraryXML, ManifestXML } from '../../xml';
import { Mapper } from './Mapper';
@@ -60,7 +60,7 @@ export class ManifestMapper extends Mapper
if(libraryAssetXML.param !== undefined) ManifestMapper.mapManifestLibraryAssetParamXML(libraryAssetXML.param, asset);
- if(BundleProvider.imageSource.has(libraryAssetXML.name)) asset.source = BundleProvider.imageSource.get(libraryAssetXML.name);
+ if(IMAGE_SOURCES.has(libraryAssetXML.name)) asset.source = IMAGE_SOURCES.get(libraryAssetXML.name);
output[libraryAssetXML.name] = asset;
}
diff --git a/src/mapping/mappers/asset/Mapper.ts b/src/common/mapping/mappers/asset/Mapper.ts
similarity index 100%
rename from src/mapping/mappers/asset/Mapper.ts
rename to src/common/mapping/mappers/asset/Mapper.ts
diff --git a/src/mapping/mappers/asset/VisualizationMapper.ts b/src/common/mapping/mappers/asset/VisualizationMapper.ts
similarity index 100%
rename from src/mapping/mappers/asset/VisualizationMapper.ts
rename to src/common/mapping/mappers/asset/VisualizationMapper.ts
diff --git a/src/mapping/mappers/asset/index.ts b/src/common/mapping/mappers/asset/index.ts
similarity index 100%
rename from src/mapping/mappers/asset/index.ts
rename to src/common/mapping/mappers/asset/index.ts
diff --git a/src/mapping/mappers/index.ts b/src/common/mapping/mappers/index.ts
similarity index 100%
rename from src/mapping/mappers/index.ts
rename to src/common/mapping/mappers/index.ts
diff --git a/src/mapping/xml/asset/IndexXML.ts b/src/common/mapping/xml/asset/IndexXML.ts
similarity index 100%
rename from src/mapping/xml/asset/IndexXML.ts
rename to src/common/mapping/xml/asset/IndexXML.ts
diff --git a/src/mapping/xml/asset/animation/AddXML.ts b/src/common/mapping/xml/asset/animation/AddXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/AddXML.ts
rename to src/common/mapping/xml/asset/animation/AddXML.ts
diff --git a/src/mapping/xml/asset/animation/AvatarXML.ts b/src/common/mapping/xml/asset/animation/AvatarXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/AvatarXML.ts
rename to src/common/mapping/xml/asset/animation/AvatarXML.ts
diff --git a/src/mapping/xml/asset/animation/DirectionOffsetXML.ts b/src/common/mapping/xml/asset/animation/DirectionOffsetXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/DirectionOffsetXML.ts
rename to src/common/mapping/xml/asset/animation/DirectionOffsetXML.ts
diff --git a/src/mapping/xml/asset/animation/DirectionXML.ts b/src/common/mapping/xml/asset/animation/DirectionXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/DirectionXML.ts
rename to src/common/mapping/xml/asset/animation/DirectionXML.ts
diff --git a/src/mapping/xml/asset/animation/EffectAnimationXML.ts b/src/common/mapping/xml/asset/animation/EffectAnimationXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/EffectAnimationXML.ts
rename to src/common/mapping/xml/asset/animation/EffectAnimationXML.ts
diff --git a/src/mapping/xml/asset/animation/EffectFramePartItemXML.ts b/src/common/mapping/xml/asset/animation/EffectFramePartItemXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/EffectFramePartItemXML.ts
rename to src/common/mapping/xml/asset/animation/EffectFramePartItemXML.ts
diff --git a/src/mapping/xml/asset/animation/EffectFramePartXML.ts b/src/common/mapping/xml/asset/animation/EffectFramePartXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/EffectFramePartXML.ts
rename to src/common/mapping/xml/asset/animation/EffectFramePartXML.ts
diff --git a/src/mapping/xml/asset/animation/EffectFrameXML.ts b/src/common/mapping/xml/asset/animation/EffectFrameXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/EffectFrameXML.ts
rename to src/common/mapping/xml/asset/animation/EffectFrameXML.ts
diff --git a/src/mapping/xml/asset/animation/OverrideXML.ts b/src/common/mapping/xml/asset/animation/OverrideXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/OverrideXML.ts
rename to src/common/mapping/xml/asset/animation/OverrideXML.ts
diff --git a/src/mapping/xml/asset/animation/RemoveXML.ts b/src/common/mapping/xml/asset/animation/RemoveXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/RemoveXML.ts
rename to src/common/mapping/xml/asset/animation/RemoveXML.ts
diff --git a/src/mapping/xml/asset/animation/ShadowXML.ts b/src/common/mapping/xml/asset/animation/ShadowXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/ShadowXML.ts
rename to src/common/mapping/xml/asset/animation/ShadowXML.ts
diff --git a/src/mapping/xml/asset/animation/SpriteXML.ts b/src/common/mapping/xml/asset/animation/SpriteXML.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/SpriteXML.ts
rename to src/common/mapping/xml/asset/animation/SpriteXML.ts
diff --git a/src/mapping/xml/asset/animation/index.ts b/src/common/mapping/xml/asset/animation/index.ts
similarity index 100%
rename from src/mapping/xml/asset/animation/index.ts
rename to src/common/mapping/xml/asset/animation/index.ts
diff --git a/src/mapping/xml/asset/assets/AssetXML.ts b/src/common/mapping/xml/asset/assets/AssetXML.ts
similarity index 100%
rename from src/mapping/xml/asset/assets/AssetXML.ts
rename to src/common/mapping/xml/asset/assets/AssetXML.ts
diff --git a/src/mapping/xml/asset/assets/AssetsXML.ts b/src/common/mapping/xml/asset/assets/AssetsXML.ts
similarity index 100%
rename from src/mapping/xml/asset/assets/AssetsXML.ts
rename to src/common/mapping/xml/asset/assets/AssetsXML.ts
diff --git a/src/mapping/xml/asset/assets/PaletteXML.ts b/src/common/mapping/xml/asset/assets/PaletteXML.ts
similarity index 100%
rename from src/mapping/xml/asset/assets/PaletteXML.ts
rename to src/common/mapping/xml/asset/assets/PaletteXML.ts
diff --git a/src/mapping/xml/asset/assets/index.ts b/src/common/mapping/xml/asset/assets/index.ts
similarity index 100%
rename from src/mapping/xml/asset/assets/index.ts
rename to src/common/mapping/xml/asset/assets/index.ts
diff --git a/src/mapping/xml/asset/index.ts b/src/common/mapping/xml/asset/index.ts
similarity index 100%
rename from src/mapping/xml/asset/index.ts
rename to src/common/mapping/xml/asset/index.ts
diff --git a/src/mapping/xml/asset/logic/ActionXML.ts b/src/common/mapping/xml/asset/logic/ActionXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/ActionXML.ts
rename to src/common/mapping/xml/asset/logic/ActionXML.ts
diff --git a/src/mapping/xml/asset/logic/CreditsXML.ts b/src/common/mapping/xml/asset/logic/CreditsXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/CreditsXML.ts
rename to src/common/mapping/xml/asset/logic/CreditsXML.ts
diff --git a/src/mapping/xml/asset/logic/CustomVarsXML.ts b/src/common/mapping/xml/asset/logic/CustomVarsXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/CustomVarsXML.ts
rename to src/common/mapping/xml/asset/logic/CustomVarsXML.ts
diff --git a/src/mapping/xml/asset/logic/LogicXML.ts b/src/common/mapping/xml/asset/logic/LogicXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/LogicXML.ts
rename to src/common/mapping/xml/asset/logic/LogicXML.ts
diff --git a/src/mapping/xml/asset/logic/MaskXML.ts b/src/common/mapping/xml/asset/logic/MaskXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/MaskXML.ts
rename to src/common/mapping/xml/asset/logic/MaskXML.ts
diff --git a/src/mapping/xml/asset/logic/PlanetSystemXML.ts b/src/common/mapping/xml/asset/logic/PlanetSystemXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/PlanetSystemXML.ts
rename to src/common/mapping/xml/asset/logic/PlanetSystemXML.ts
diff --git a/src/mapping/xml/asset/logic/SoundSampleXML.ts b/src/common/mapping/xml/asset/logic/SoundSampleXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/SoundSampleXML.ts
rename to src/common/mapping/xml/asset/logic/SoundSampleXML.ts
diff --git a/src/mapping/xml/asset/logic/index.ts b/src/common/mapping/xml/asset/logic/index.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/index.ts
rename to src/common/mapping/xml/asset/logic/index.ts
diff --git a/src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts b/src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts
similarity index 59%
rename from src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts
rename to src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts
index 2507c6a..a04fb6a 100644
--- a/src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts
+++ b/src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts
@@ -3,6 +3,7 @@ export class ModelDimensionsXML
private readonly _x: number;
private readonly _y: number;
private readonly _z: number;
+ private readonly _centerZ: number;
constructor(xml: any)
{
@@ -10,9 +11,10 @@ export class ModelDimensionsXML
if(attributes !== undefined)
{
- if(attributes.x !== undefined) this._x = parseInt(attributes.x);
- if(attributes.y !== undefined) this._y = parseInt(attributes.y);
+ if(attributes.x !== undefined) this._x = parseFloat(attributes.x);
+ if(attributes.y !== undefined) this._y = parseFloat(attributes.y);
if(attributes.z !== undefined) this._z = parseFloat(attributes.z);
+ if(attributes.centerZ !== undefined) this._centerZ = parseFloat(attributes.centerZ);
}
}
@@ -30,4 +32,9 @@ export class ModelDimensionsXML
{
return this._z;
}
+
+ public get centerZ(): number
+ {
+ return this._centerZ;
+ }
}
diff --git a/src/mapping/xml/asset/logic/model/ModelDirectionXML.ts b/src/common/mapping/xml/asset/logic/model/ModelDirectionXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/model/ModelDirectionXML.ts
rename to src/common/mapping/xml/asset/logic/model/ModelDirectionXML.ts
diff --git a/src/mapping/xml/asset/logic/model/ModelXML.ts b/src/common/mapping/xml/asset/logic/model/ModelXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/model/ModelXML.ts
rename to src/common/mapping/xml/asset/logic/model/ModelXML.ts
diff --git a/src/mapping/xml/asset/logic/model/index.ts b/src/common/mapping/xml/asset/logic/model/index.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/model/index.ts
rename to src/common/mapping/xml/asset/logic/model/index.ts
diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts
rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts
diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts
rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts
diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts
rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts
diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts
rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts
diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts
rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts
diff --git a/src/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts
rename to src/common/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts
diff --git a/src/mapping/xml/asset/logic/particlesystem/index.ts b/src/common/mapping/xml/asset/logic/particlesystem/index.ts
similarity index 100%
rename from src/mapping/xml/asset/logic/particlesystem/index.ts
rename to src/common/mapping/xml/asset/logic/particlesystem/index.ts
diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts
similarity index 100%
rename from src/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts
rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts
diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts
similarity index 100%
rename from src/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts
rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts
diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts
similarity index 100%
rename from src/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts
rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts
diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryXML.ts
similarity index 100%
rename from src/mapping/xml/asset/manifest/ManifestLibraryXML.ts
rename to src/common/mapping/xml/asset/manifest/ManifestLibraryXML.ts
diff --git a/src/mapping/xml/asset/manifest/ManifestXML.ts b/src/common/mapping/xml/asset/manifest/ManifestXML.ts
similarity index 100%
rename from src/mapping/xml/asset/manifest/ManifestXML.ts
rename to src/common/mapping/xml/asset/manifest/ManifestXML.ts
diff --git a/src/mapping/xml/asset/manifest/index.ts b/src/common/mapping/xml/asset/manifest/index.ts
similarity index 100%
rename from src/mapping/xml/asset/manifest/index.ts
rename to src/common/mapping/xml/asset/manifest/index.ts
diff --git a/src/mapping/xml/asset/visualization/GestureXML.ts b/src/common/mapping/xml/asset/visualization/GestureXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/GestureXML.ts
rename to src/common/mapping/xml/asset/visualization/GestureXML.ts
diff --git a/src/mapping/xml/asset/visualization/LayerXML.ts b/src/common/mapping/xml/asset/visualization/LayerXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/LayerXML.ts
rename to src/common/mapping/xml/asset/visualization/LayerXML.ts
diff --git a/src/mapping/xml/asset/visualization/PostureXML.ts b/src/common/mapping/xml/asset/visualization/PostureXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/PostureXML.ts
rename to src/common/mapping/xml/asset/visualization/PostureXML.ts
diff --git a/src/mapping/xml/asset/visualization/VisualDirectionXML.ts b/src/common/mapping/xml/asset/visualization/VisualDirectionXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/VisualDirectionXML.ts
rename to src/common/mapping/xml/asset/visualization/VisualDirectionXML.ts
diff --git a/src/mapping/xml/asset/visualization/VisualizationDataXML.ts b/src/common/mapping/xml/asset/visualization/VisualizationDataXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/VisualizationDataXML.ts
rename to src/common/mapping/xml/asset/visualization/VisualizationDataXML.ts
diff --git a/src/mapping/xml/asset/visualization/VisualizationXML.ts b/src/common/mapping/xml/asset/visualization/VisualizationXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/VisualizationXML.ts
rename to src/common/mapping/xml/asset/visualization/VisualizationXML.ts
diff --git a/src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts b/src/common/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts
rename to src/common/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts
diff --git a/src/mapping/xml/asset/visualization/animation/AnimationXML.ts b/src/common/mapping/xml/asset/visualization/animation/AnimationXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/animation/AnimationXML.ts
rename to src/common/mapping/xml/asset/visualization/animation/AnimationXML.ts
diff --git a/src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts
rename to src/common/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts
diff --git a/src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts
rename to src/common/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts
diff --git a/src/mapping/xml/asset/visualization/animation/FrameXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/animation/FrameXML.ts
rename to src/common/mapping/xml/asset/visualization/animation/FrameXML.ts
diff --git a/src/mapping/xml/asset/visualization/animation/index.ts b/src/common/mapping/xml/asset/visualization/animation/index.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/animation/index.ts
rename to src/common/mapping/xml/asset/visualization/animation/index.ts
diff --git a/src/mapping/xml/asset/visualization/color/ColorLayerXML.ts b/src/common/mapping/xml/asset/visualization/color/ColorLayerXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/color/ColorLayerXML.ts
rename to src/common/mapping/xml/asset/visualization/color/ColorLayerXML.ts
diff --git a/src/mapping/xml/asset/visualization/color/ColorXML.ts b/src/common/mapping/xml/asset/visualization/color/ColorXML.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/color/ColorXML.ts
rename to src/common/mapping/xml/asset/visualization/color/ColorXML.ts
diff --git a/src/mapping/xml/asset/visualization/color/index.ts b/src/common/mapping/xml/asset/visualization/color/index.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/color/index.ts
rename to src/common/mapping/xml/asset/visualization/color/index.ts
diff --git a/src/mapping/xml/asset/visualization/index.ts b/src/common/mapping/xml/asset/visualization/index.ts
similarity index 100%
rename from src/mapping/xml/asset/visualization/index.ts
rename to src/common/mapping/xml/asset/visualization/index.ts
diff --git a/src/mapping/xml/effectmap/EffectMapEffectXML.ts b/src/common/mapping/xml/effectmap/EffectMapEffectXML.ts
similarity index 95%
rename from src/mapping/xml/effectmap/EffectMapEffectXML.ts
rename to src/common/mapping/xml/effectmap/EffectMapEffectXML.ts
index f48d8d0..735519d 100644
--- a/src/mapping/xml/effectmap/EffectMapEffectXML.ts
+++ b/src/common/mapping/xml/effectmap/EffectMapEffectXML.ts
@@ -1,41 +1,41 @@
-
-export class EffectMapEffectXML
-{
- private _id: string;
- private _lib: string;
- private _type: string;
- private _revision: number;
-
- constructor(xml: any)
- {
- const attributes = xml.$;
-
- if(attributes)
- {
- if(attributes.id !== undefined) this._id = attributes.id;
- if(attributes.lib !== undefined) this._lib = attributes.lib;
- if(attributes.type !== undefined) this._type = attributes.type;
- if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision);
- }
- }
-
- public get id(): string
- {
- return this._id;
- }
-
- public get lib(): string
- {
- return this._lib;
- }
-
- public get type(): string
- {
- return this._type;
- }
-
- public get revision(): number
- {
- return this._revision;
- }
-}
+
+export class EffectMapEffectXML
+{
+ private _id: string;
+ private _lib: string;
+ private _type: string;
+ private _revision: number;
+
+ constructor(xml: any)
+ {
+ const attributes = xml.$;
+
+ if(attributes)
+ {
+ if(attributes.id !== undefined) this._id = attributes.id;
+ if(attributes.lib !== undefined) this._lib = attributes.lib;
+ if(attributes.type !== undefined) this._type = attributes.type;
+ if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision);
+ }
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get lib(): string
+ {
+ return this._lib;
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+
+ public get revision(): number
+ {
+ return this._revision;
+ }
+}
diff --git a/src/mapping/xml/effectmap/EffectMapXML.ts b/src/common/mapping/xml/effectmap/EffectMapXML.ts
similarity index 100%
rename from src/mapping/xml/effectmap/EffectMapXML.ts
rename to src/common/mapping/xml/effectmap/EffectMapXML.ts
diff --git a/src/mapping/xml/effectmap/index.ts b/src/common/mapping/xml/effectmap/index.ts
similarity index 100%
rename from src/mapping/xml/effectmap/index.ts
rename to src/common/mapping/xml/effectmap/index.ts
diff --git a/src/mapping/xml/figuredata/FigureDataColorXML.ts b/src/common/mapping/xml/figuredata/FigureDataColorXML.ts
similarity index 100%
rename from src/mapping/xml/figuredata/FigureDataColorXML.ts
rename to src/common/mapping/xml/figuredata/FigureDataColorXML.ts
diff --git a/src/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts b/src/common/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts
similarity index 100%
rename from src/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts
rename to src/common/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts
diff --git a/src/mapping/xml/figuredata/FigureDataPaletteXML.ts b/src/common/mapping/xml/figuredata/FigureDataPaletteXML.ts
similarity index 100%
rename from src/mapping/xml/figuredata/FigureDataPaletteXML.ts
rename to src/common/mapping/xml/figuredata/FigureDataPaletteXML.ts
diff --git a/src/mapping/xml/figuredata/FigureDataPartXML.ts b/src/common/mapping/xml/figuredata/FigureDataPartXML.ts
similarity index 100%
rename from src/mapping/xml/figuredata/FigureDataPartXML.ts
rename to src/common/mapping/xml/figuredata/FigureDataPartXML.ts
diff --git a/src/mapping/xml/figuredata/FigureDataSetTypeXML.ts b/src/common/mapping/xml/figuredata/FigureDataSetTypeXML.ts
similarity index 100%
rename from src/mapping/xml/figuredata/FigureDataSetTypeXML.ts
rename to src/common/mapping/xml/figuredata/FigureDataSetTypeXML.ts
diff --git a/src/mapping/xml/figuredata/FigureDataSetXML.ts b/src/common/mapping/xml/figuredata/FigureDataSetXML.ts
similarity index 100%
rename from src/mapping/xml/figuredata/FigureDataSetXML.ts
rename to src/common/mapping/xml/figuredata/FigureDataSetXML.ts
diff --git a/src/mapping/xml/figuredata/FigureDataXML.ts b/src/common/mapping/xml/figuredata/FigureDataXML.ts
similarity index 100%
rename from src/mapping/xml/figuredata/FigureDataXML.ts
rename to src/common/mapping/xml/figuredata/FigureDataXML.ts
diff --git a/src/mapping/xml/figuredata/index.ts b/src/common/mapping/xml/figuredata/index.ts
similarity index 100%
rename from src/mapping/xml/figuredata/index.ts
rename to src/common/mapping/xml/figuredata/index.ts
diff --git a/src/mapping/xml/figuremap/FigureLibraryPartXML.ts b/src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts
similarity index 95%
rename from src/mapping/xml/figuremap/FigureLibraryPartXML.ts
rename to src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts
index 964ae29..11c62f4 100644
--- a/src/mapping/xml/figuremap/FigureLibraryPartXML.ts
+++ b/src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts
@@ -1,26 +1,26 @@
-export class FigureLibraryPartXML
-{
- private _id: number;
- private _type: string;
-
- constructor(xml: any)
- {
- const attributes = xml.$;
-
- if(attributes)
- {
- if(attributes.id !== undefined) this._id = parseInt(attributes.id);
- if(attributes.type !== undefined) this._type = attributes.type;
- }
- }
-
- public get id(): number
- {
- return this._id;
- }
-
- public get type(): string
- {
- return this._type;
- }
-}
+export class FigureLibraryPartXML
+{
+ private _id: number;
+ private _type: string;
+
+ constructor(xml: any)
+ {
+ const attributes = xml.$;
+
+ if(attributes)
+ {
+ if(attributes.id !== undefined) this._id = parseInt(attributes.id);
+ if(attributes.type !== undefined) this._type = attributes.type;
+ }
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+}
diff --git a/src/mapping/xml/figuremap/FigureLibraryXML.ts b/src/common/mapping/xml/figuremap/FigureLibraryXML.ts
similarity index 95%
rename from src/mapping/xml/figuremap/FigureLibraryXML.ts
rename to src/common/mapping/xml/figuremap/FigureLibraryXML.ts
index 3522491..487da09 100644
--- a/src/mapping/xml/figuremap/FigureLibraryXML.ts
+++ b/src/common/mapping/xml/figuremap/FigureLibraryXML.ts
@@ -1,49 +1,49 @@
-import { FigureLibraryPartXML } from './FigureLibraryPartXML';
-
-export class FigureLibraryXML
-{
- private _id: string;
- private _revision: number;
- private _parts: FigureLibraryPartXML[];
-
- constructor(xml: any)
- {
- const attributes = xml.$;
-
- if(attributes)
- {
- if(attributes.id !== undefined) this._id = attributes.id;
- if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision);
- }
-
- if(xml.part !== undefined)
- {
- if(Array.isArray(xml.part))
- {
- this._parts = [];
-
- for(const partId in xml.part)
- {
- const part = xml.part[partId];
-
- this._parts.push(new FigureLibraryPartXML(part));
- }
- }
- }
- }
-
- public get id(): string
- {
- return this._id;
- }
-
- public get revision(): number
- {
- return this._revision;
- }
-
- public get parts(): FigureLibraryPartXML[]
- {
- return this._parts;
- }
-}
+import { FigureLibraryPartXML } from './FigureLibraryPartXML';
+
+export class FigureLibraryXML
+{
+ private _id: string;
+ private _revision: number;
+ private _parts: FigureLibraryPartXML[];
+
+ constructor(xml: any)
+ {
+ const attributes = xml.$;
+
+ if(attributes)
+ {
+ if(attributes.id !== undefined) this._id = attributes.id;
+ if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision);
+ }
+
+ if(xml.part !== undefined)
+ {
+ if(Array.isArray(xml.part))
+ {
+ this._parts = [];
+
+ for(const partId in xml.part)
+ {
+ const part = xml.part[partId];
+
+ this._parts.push(new FigureLibraryPartXML(part));
+ }
+ }
+ }
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get revision(): number
+ {
+ return this._revision;
+ }
+
+ public get parts(): FigureLibraryPartXML[]
+ {
+ return this._parts;
+ }
+}
diff --git a/src/mapping/xml/figuremap/FigureMapXML.ts b/src/common/mapping/xml/figuremap/FigureMapXML.ts
similarity index 100%
rename from src/mapping/xml/figuremap/FigureMapXML.ts
rename to src/common/mapping/xml/figuremap/FigureMapXML.ts
diff --git a/src/mapping/xml/figuremap/index.ts b/src/common/mapping/xml/figuremap/index.ts
similarity index 100%
rename from src/mapping/xml/figuremap/index.ts
rename to src/common/mapping/xml/figuremap/index.ts
diff --git a/src/mapping/xml/furnituredata/FurnitureDataXML.ts b/src/common/mapping/xml/furnituredata/FurnitureDataXML.ts
similarity index 100%
rename from src/mapping/xml/furnituredata/FurnitureDataXML.ts
rename to src/common/mapping/xml/furnituredata/FurnitureDataXML.ts
diff --git a/src/mapping/xml/furnituredata/FurnitureTypeXML.ts b/src/common/mapping/xml/furnituredata/FurnitureTypeXML.ts
similarity index 100%
rename from src/mapping/xml/furnituredata/FurnitureTypeXML.ts
rename to src/common/mapping/xml/furnituredata/FurnitureTypeXML.ts
diff --git a/src/mapping/xml/furnituredata/index.ts b/src/common/mapping/xml/furnituredata/index.ts
similarity index 100%
rename from src/mapping/xml/furnituredata/index.ts
rename to src/common/mapping/xml/furnituredata/index.ts
diff --git a/src/mapping/xml/index.ts b/src/common/mapping/xml/index.ts
similarity index 100%
rename from src/mapping/xml/index.ts
rename to src/common/mapping/xml/index.ts
diff --git a/src/common/utils/BinaryReader.ts b/src/common/utils/BinaryReader.ts
new file mode 100644
index 0000000..60869c5
--- /dev/null
+++ b/src/common/utils/BinaryReader.ts
@@ -0,0 +1,62 @@
+export class BinaryReader
+{
+ private _position: number;
+ private _dataView: DataView;
+
+ constructor(buffer: ArrayBuffer)
+ {
+ this._position = 0;
+ this._dataView = new DataView(buffer);
+ }
+
+ public readByte(): number
+ {
+ const byte = this._dataView.getInt8(this._position);
+
+ this._position++;
+
+ return byte;
+ }
+
+ public readBytes(length: number): BinaryReader
+ {
+ const buffer = new BinaryReader(this._dataView.buffer.slice(this._position, this._position + length));
+
+ this._position += length;
+
+ return buffer;
+ }
+
+ public readShort(): number
+ {
+ const short = this._dataView.getInt16(this._position);
+
+ this._position += 2;
+
+ return short;
+ }
+
+ public readInt(): number
+ {
+ const int = this._dataView.getInt32(this._position);
+
+ this._position += 4;
+
+ return int;
+ }
+
+ public remaining(): number
+ {
+ return this._dataView.byteLength - this._position;
+ }
+
+ public toString(encoding?: string): string
+ {
+ return new TextDecoder().decode(this._dataView.buffer);
+ }
+
+ public toArrayBuffer(): ArrayBuffer
+ {
+ return this._dataView.buffer;
+ }
+}
diff --git a/src/utils/CustomIterator.ts b/src/common/utils/CustomIterator.ts
similarity index 97%
rename from src/utils/CustomIterator.ts
rename to src/common/utils/CustomIterator.ts
index 72abc2f..1e8f37d 100644
--- a/src/utils/CustomIterator.ts
+++ b/src/common/utils/CustomIterator.ts
@@ -1,6 +1,5 @@
-export default class CustomIterator
+export class CustomIterator
{
-
private idx: number;
private readonly top: number;
private readonly keys: Array;
diff --git a/src/common/utils/File.ts b/src/common/utils/File.ts
new file mode 100644
index 0000000..9ba26fc
--- /dev/null
+++ b/src/common/utils/File.ts
@@ -0,0 +1,101 @@
+import { existsSync } from 'fs';
+import { lstat, mkdir, readdir, readFile, writeFile } from 'fs/promises';
+
+export class File
+{
+ constructor(private readonly _path: string)
+ {}
+
+ public async createDirectory(): Promise
+ {
+ try
+ {
+ await mkdir(this._path, { recursive: true });
+
+ return true;
+ }
+
+ catch (error)
+ {
+ if(error.code && (error.code === 'EEXISTS')) return true;
+
+ console.error(error);
+
+ return false;
+ }
+ }
+
+ public exists(): boolean
+ {
+ if(existsSync(this._path)) return true;
+
+ return false;
+ }
+
+ public async getFileList(): Promise
+ {
+ try
+ {
+ return await readdir(this._path);
+ }
+
+ catch (error)
+ {
+ console.error(error);
+
+ return null;
+ }
+ }
+
+ public async isDirectory(): Promise
+ {
+ try
+ {
+ return (await lstat(this._path)).isDirectory();
+ }
+
+ catch (error)
+ {
+ console.error(error);
+
+ return false;
+ }
+ }
+
+ public async getContentsAsBuffer(): Promise
+ {
+ try
+ {
+ return await readFile(this._path);
+ }
+
+ catch (error)
+ {
+ console.error(error);
+
+ return null;
+ }
+ }
+
+ public async writeData(data: string | Uint8Array): Promise
+ {
+ try
+ {
+ await writeFile(this._path, data);
+
+ return true;
+ }
+
+ catch (error)
+ {
+ console.error(error);
+
+ return false;
+ }
+ }
+
+ public get path(): string
+ {
+ return this._path;
+ }
+}
diff --git a/src/utils/FileUtilities.ts b/src/common/utils/FileUtilities.ts
similarity index 68%
rename from src/utils/FileUtilities.ts
rename to src/common/utils/FileUtilities.ts
index 4917252..1cab562 100644
--- a/src/utils/FileUtilities.ts
+++ b/src/common/utils/FileUtilities.ts
@@ -1,24 +1,14 @@
-import { readFile } from 'fs';
+import { readFile } from 'fs/promises';
import * as fetch from 'node-fetch';
-import { promisify } from 'util';
import { File } from './File';
-const readFileAsync = promisify(readFile);
-
export class FileUtilities
{
- public static getDirectory(baseFolderPath: string, childFolderName: string = null): File
+ public static async getDirectory(path: string): Promise
{
- let folder = new File(baseFolderPath);
+ const folder = new File(path);
- if(!folder.isDirectory()) folder.mkdirs();
-
- if(childFolderName)
- {
- folder = new File(folder.path + childFolderName);
-
- if(!folder.isDirectory()) folder.mkdirs();
- }
+ await folder.createDirectory();
return folder;
}
@@ -42,7 +32,7 @@ export class FileUtilities
}
else
{
- content = await readFileAsync(url);
+ content = await readFile(url);
}
return content;
@@ -65,7 +55,7 @@ export class FileUtilities
}
else
{
- const data = await readFileAsync(url);
+ const data = await readFile(url);
content = data.toString('utf-8');
}
diff --git a/src/utils/SlicedToArray.ts b/src/common/utils/SlicedToArray.ts
similarity index 53%
rename from src/utils/SlicedToArray.ts
rename to src/common/utils/SlicedToArray.ts
index ba0c681..863cc01 100644
--- a/src/utils/SlicedToArray.ts
+++ b/src/common/utils/SlicedToArray.ts
@@ -4,7 +4,7 @@ export class SlicedToArray
{
if(Array.isArray(arr)) return arr;
- if(Symbol.iterator in Object(arr)) return SlicedToArray.sliceIterator(arr, i);
+ if(Symbol.iterator in Object(arr)) return this.sliceIterator(arr, i);
throw new TypeError('Invalid attempt to destructure non-iterable instance');
}
@@ -13,37 +13,27 @@ export class SlicedToArray
{
const _arr = [];
+ let _i = null;
+ let _s = null;
let _n = true;
- let _d = false;
- let _e = undefined;
try
{
- for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true)
+ for(_i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true)
{
_arr.push(_s.value);
if(i && _arr.length === i) break;
}
+
+ if(!_n && _i['return']) _i['return']();
}
catch (err)
{
- _d = true;
- _e = err;
- }
+ if(!_n && _i['return']) _i['return']();
- finally
- {
- try
- {
- if(!_n && _i['return']) _i['return']();
- }
-
- finally
- {
- if(_d) throw _e;
- }
+ throw err;
}
return _arr;
diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts
new file mode 100644
index 0000000..7299482
--- /dev/null
+++ b/src/common/utils/index.ts
@@ -0,0 +1,5 @@
+export * from './BinaryReader';
+export * from './CustomIterator';
+export * from './File';
+export * from './FileUtilities';
+export * from './SlicedToArray';
diff --git a/src/configuration.json.example b/src/configuration.json.example
index 27521c3..c7ae69d 100644
--- a/src/configuration.json.example
+++ b/src/configuration.json.example
@@ -1,5 +1,4 @@
{
- "output.folder": "C:/nitro-converted-assets/",
"flash.client.url": "",
"furnidata.load.url": "",
"productdata.load.url": "",
@@ -12,10 +11,11 @@
"flash.dynamic.download.url": "",
"dynamic.download.furniture.url": "${flash.dynamic.download.url}%revision%/%className%.swf",
"external.variables.url": "https://www.habbo.com/gamedata/external_variables/1",
- "external.texts.url": "",
- "convert.figure": "0",
- "convert.effect": "0",
- "convert.furniture": "0",
- "convert.pet": "0",
- "misc.log_download_urls": "0"
+ "external.texts.url": "${external.texts.txt}",
+ "convert.figure": "1",
+ "convert.effect": "1",
+ "convert.furniture": "1",
+ "convert.furniture.floor.only": "0",
+ "convert.furniture.wall.only": "0",
+ "convert.pet": "1"
}
diff --git a/src/converters/ConverterUtilities.ts b/src/converters/ConverterUtilities.ts
new file mode 100644
index 0000000..eb43f3f
--- /dev/null
+++ b/src/converters/ConverterUtilities.ts
@@ -0,0 +1,311 @@
+import ora from 'ora';
+import { singleton } from 'tsyringe';
+import { Configuration, File, FileUtilities, NitroBundle } from '../common';
+import { GenerateNitroBundleFromSwf, SWFDownloader } from '../swf';
+import { EffectMapConverter } from './EffectMapConverter';
+import { FigureMapConverter } from './FigureMapConverter';
+import { FurnitureDataConverter } from './FurnitureDataConverter';
+
+@singleton()
+export class ConverterUtilities
+{
+ private static BUNDLE_TYPES: string[] = [ 'furniture', 'figure', 'effect', 'pet', 'generic' ];
+ private static DOWNLOAD_SWF_TYPES: string[] = [ 'furniture', 'figure', 'effect', 'pet' ];
+
+ constructor(
+ private readonly _furnitureDataConverter: FurnitureDataConverter,
+ private readonly _figureMapConverter: FigureMapConverter,
+ private readonly _effectMapConverter: EffectMapConverter,
+ private readonly _configuration: Configuration)
+ {}
+
+ public async downloadSwfTypes(): Promise
+ {
+ const floorOnly = (this._configuration.getBoolean('convert.furniture.floor.only') || false);
+ const wallOnly = (this._configuration.getBoolean('convert.furniture.wall.only') || false);
+
+ for(const downloadType of ConverterUtilities.DOWNLOAD_SWF_TYPES)
+ {
+ if(!this._configuration.getBoolean(`convert.${ downloadType }`)) continue;
+
+ const now = Date.now();
+ const spinner = ora(`Preparing ${ downloadType }`).start();
+ const downloadBase = this.getDownloadBaseUrl(downloadType);
+ const saveDirectory = await FileUtilities.getDirectory(`./assets/bundled/${ downloadType }`);
+ const classNamesWithRevisions = await this.getClassNamesWithRevision(downloadType, floorOnly, wallOnly);
+ const classNames = Object.keys(classNamesWithRevisions);
+
+ if(classNames && classNames.length)
+ {
+ const totalClassNames = classNames.length;
+
+ for(let i = 0; i < totalClassNames; i++)
+ {
+ const className = classNames[i];
+ const revision = (classNamesWithRevisions[className] || '-1');
+
+ try
+ {
+ const saveFile = new File(`${ saveDirectory.path }/${ className }.nitro`);
+
+ if(saveFile.exists()) continue;
+
+ spinner.text = `Converting: ${ className } (${ (i + 1) } / ${ totalClassNames })`;
+ spinner.render();
+
+ const downloadUrl = SWFDownloader.getDownloadUrl(downloadBase, className, revision);
+ const habboAssetSwf = await SWFDownloader.downloadFromUrl(downloadUrl);
+
+ if(!habboAssetSwf)
+ {
+ console.log();
+ console.error(`Invalid SWF: ${ className }`);
+
+ continue;
+ }
+
+ const nitroBundle = await GenerateNitroBundleFromSwf(habboAssetSwf);
+
+ await saveFile.writeData(await nitroBundle.toBufferAsync());
+
+ spinner.text = `Converted: ${ className }`;
+ spinner.render();
+ }
+
+ catch (error)
+ {
+ console.log();
+ console.error(`Error Converting: ${ className } - ${ error.message }`);
+
+ continue;
+ }
+ }
+ }
+
+ spinner.succeed(`Finished ${ downloadType } in ${ Date.now() - now }ms`);
+ }
+ }
+
+ public getDownloadBaseUrl(type: string): string
+ {
+ switch(type)
+ {
+ case 'furniture':
+ return this._configuration.getValue('dynamic.download.furniture.url');
+ case 'figure':
+ return this._configuration.getValue('dynamic.download.figure.url');
+ case 'effect':
+ return this._configuration.getValue('dynamic.download.effect.url');
+ case 'pet':
+ return this._configuration.getValue('dynamic.download.pet.url');
+ }
+
+ return null;
+ }
+
+ public async getClassNamesWithRevision(type: string, floorOnly: boolean = false, wallOnly: boolean = false): Promise<{ [index: string ]: string }>
+ {
+ switch(type)
+ {
+ case 'furniture':
+ return await this._furnitureDataConverter.getClassNamesAndRevisions(floorOnly, wallOnly);
+ case 'figure':
+ return await this._figureMapConverter.getClassNamesAndRevisions();
+ case 'effect':
+ return await this._effectMapConverter.getClassNamesAndRevisions();
+ case 'pet': {
+ const entries: { [index: string]: string } = {};
+ const classNames = this._configuration.getValue('pet.configuration').split(',');
+
+ for(const className of classNames) entries[className] = '-1';
+
+ return entries;
+ }
+ }
+
+ return null;
+ }
+
+ public async extractNitroFromFolder(): Promise
+ {
+ const now = Date.now();
+ const spinner = ora('Preparing Extraction').start();
+ const extractBaseDirectory = await FileUtilities.getDirectory('./assets/extract');
+ const extractedBaseDirectory = await FileUtilities.getDirectory('./assets/extracted');
+
+ for await (const type of ConverterUtilities.BUNDLE_TYPES)
+ {
+ const extractTypeDirectory = await FileUtilities.getDirectory(`${ extractBaseDirectory.path }/${ type }`);
+ const extractedTypeDirectory = await FileUtilities.getDirectory(`${ extractedBaseDirectory.path }/${ type }`);
+ const files = await extractTypeDirectory.getFileList();
+
+ for await (const name of files)
+ {
+ const [ className, extension, ...rest ] = name.split('.');
+
+ try
+ {
+ spinner.text = `Extracting: ${ className }`;
+ spinner.render();
+
+ const saveDirectory = await FileUtilities.getDirectory(`${ extractedTypeDirectory.path }/${ className }`);
+
+ const file = new File(`${ extractTypeDirectory.path }/${ name }`);
+
+ if(extension === 'nitro')
+ {
+ const nitroBundle = NitroBundle.from((await file.getContentsAsBuffer()).buffer);
+
+ for await (const [ bundleName, bundleBuffer ] of nitroBundle.files.entries())
+ {
+ const saveFile = new File(`${ saveDirectory.path }/${ bundleName }`);
+
+ await saveFile.writeData(bundleBuffer);
+ }
+
+ spinner.text = `Extracted: ${ className }`;
+ spinner.render();
+ }
+ }
+
+ catch (error)
+ {
+ console.log();
+ console.error(`Error Extracting: ${ name } - ${ error.message }`);
+ }
+ }
+ }
+
+ spinner.succeed(`Extraction: Finished in ${ Date.now() - now }ms`);
+ }
+
+ public async convertSwfFromFolder(): Promise
+ {
+ const now = Date.now();
+ const spinner = ora('Preparing SWF Extraction').start();
+ const swfBaseDirectory = await FileUtilities.getDirectory('./assets/swf');
+ const bundledBaseDirectory = await FileUtilities.getDirectory('./assets/bundled');
+
+ for await (const type of ConverterUtilities.BUNDLE_TYPES)
+ {
+ const swfTypeDirectory = await FileUtilities.getDirectory(`${ swfBaseDirectory.path }/${ type }`);
+ const bundledTypeDirectory = await FileUtilities.getDirectory(`${ bundledBaseDirectory.path }/${ type }`);
+ const files = await swfTypeDirectory.getFileList();
+
+ for await (const name of files)
+ {
+ const [ className, extension, ...rest ] = name.split('.');
+
+ try
+ {
+ spinner.text = `Extracting SWF: ${ className }`;
+ spinner.render();
+
+ const downloadUrl = `${ swfTypeDirectory.path }/${ className }.swf`;
+ const habboAssetSwf = await SWFDownloader.downloadFromUrl(downloadUrl);
+
+ if(!habboAssetSwf)
+ {
+ console.log();
+ console.error(`Invalid SWF: ${ downloadUrl }`);
+
+ continue;
+ }
+
+ const nitroBundle = await GenerateNitroBundleFromSwf(habboAssetSwf);
+
+ if(!nitroBundle)
+ {
+ console.log();
+ console.error(`Invalid SWF Bundle: ${ downloadUrl }`);
+
+ continue;
+ }
+
+ const saveFile = new File(`${ bundledTypeDirectory.path }/${ className }.nitro`);
+
+ await saveFile.writeData(await nitroBundle.toBufferAsync());
+
+ spinner.text = `Extracted SWF: ${ className }`;
+ spinner.render();
+ }
+
+ catch (error)
+ {
+ console.log();
+ console.error(`Error Extracting: ${ name } - ${ error.message }`);
+ }
+ }
+ }
+
+ spinner.succeed(`SWF Extraction: Finished in ${ Date.now() - now }ms`);
+ }
+
+ public async bundleExtractedFromFolder(): Promise
+ {
+ const now = Date.now();
+ const spinner = ora('Preparing Bundler').start();
+ const bundleBaseDirectory = await FileUtilities.getDirectory('./assets/extracted');
+ const bundledBaseDirectory = await FileUtilities.getDirectory('./assets/bundled');
+
+ for await (const type of ConverterUtilities.BUNDLE_TYPES)
+ {
+ const bundleTypeDirectory = await FileUtilities.getDirectory(`${ bundleBaseDirectory.path }/${ type }`);
+ const bundledTypeDirectory = await FileUtilities.getDirectory(`${ bundledBaseDirectory.path }/${ type }`);
+ const files = await bundleTypeDirectory.getFileList();
+
+ for await (const name of files)
+ {
+ const [ className, extension, ...rest ] = name.split('.');
+
+ try
+ {
+ const bundleDirectory = new File(`${ bundleTypeDirectory.path }/${ name }`);
+
+ if(!await bundleDirectory.isDirectory()) continue;
+
+ spinner.text = `Bundling: ${ className }`;
+ spinner.render();
+
+ const nitroBundle = new NitroBundle();
+ const childFiles = await bundleDirectory.getFileList();
+
+ if(childFiles && childFiles.length)
+ {
+ for await (const childName of childFiles)
+ {
+ const childFile = new File(`${ bundleDirectory.path }/${ childName }`);
+
+ nitroBundle.addFile(childName, await childFile.getContentsAsBuffer());
+ }
+ }
+
+ if(nitroBundle.totalFiles)
+ {
+ const saveFile = new File(`${ bundledTypeDirectory.path }/${ className }.nitro`);
+
+ await saveFile.writeData(await nitroBundle.toBufferAsync());
+ }
+ else
+ {
+ console.log();
+ console.error(`Error Bundling: ${ name } - The bundle was empty`);
+
+ continue;
+ }
+
+ spinner.text = `Bundled: ${ name }`;
+ spinner.render();
+ }
+
+ catch (error)
+ {
+ console.log();
+ console.error(`Error Bundling: ${ name } - ${ error.message }`);
+ }
+ }
+ }
+
+ spinner.succeed(`Bundler: Finished in ${ Date.now() - now }ms`);
+ }
+}
diff --git a/src/converters/EffectConverter.ts b/src/converters/EffectConverter.ts
deleted file mode 100644
index c495b4d..0000000
--- a/src/converters/EffectConverter.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
-import { singleton } from 'tsyringe';
-import { BundleProvider } from '../common/bundle/BundleProvider';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { SWFConverter } from '../common/converters/SWFConverter';
-import { SWFDownloader } from '../common/SWFDownloader';
-import { File } from '../utils/File';
-import { FileUtilities } from '../utils/FileUtilities';
-import { EffectMapConverter } from './EffectMapConverter';
-
-@singleton()
-export class EffectConverter extends Converter
-{
- public effectTypes: Map = new Map();
-
- constructor(
- private readonly _effectMapConverter: EffectMapConverter,
- private readonly _configuration: Configuration)
- {
- super();
- }
-
- public async convertAsync(args: string[] = []): Promise
- {
- if(!this._configuration.getBoolean('convert.effect')) return;
-
- const now = Date.now();
- const spinner = ora('Preparing Effects').start();
- const baseUrl = this._configuration.getValue('dynamic.download.effect.url');
- const effectMap = this._effectMapConverter.effectMap;
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'effect');
-
- const classNames: string[] = [];
-
- if(effectMap.effects !== undefined)
- {
- for(const library of effectMap.effects)
- {
- const className = library.lib;
-
- if(classNames.indexOf(className) >= 0) continue;
-
- classNames.push(className);
-
- this.effectTypes.set(className, library.type);
- }
- }
-
- for(const className of classNames)
- {
- try
- {
- const path = new File(directory.path + '/' + className + '.nitro');
-
- if(path.exists()) continue;
-
- const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1);
-
- if(!habboAssetSWF)
- {
- spinner.text = 'Couldnt convert effect: ' + className;
-
- spinner.render();
-
- continue;
- }
- else
- {
- spinner.text = 'Converting: ' + className;
-
- spinner.render();
- }
-
- const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF);
- const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, className);
-
- if(assetData)
- {
- assetData.name = className;
- assetData.type = this.effectTypes.get(className);
- }
-
- const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle);
-
- await writeFile(path.path, await nitroBundle.toBufferAsync());
-
- spinner.text = 'Finished: ' + className;
-
- spinner.render();
- }
-
- catch (error)
- {
- spinner.text = `Error converting ${ className }: ${ error.message }`;
-
- spinner.render();
-
- continue;
- }
- }
-
- console.log();
- spinner.succeed(`Effects finished in ${ Date.now() - now }ms`);
- }
-}
diff --git a/src/converters/EffectMapConverter.ts b/src/converters/EffectMapConverter.ts
index 35210fb..4b2d744 100644
--- a/src/converters/EffectMapConverter.ts
+++ b/src/converters/EffectMapConverter.ts
@@ -1,48 +1,33 @@
import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
+import ora from 'ora';
import { singleton } from 'tsyringe';
import { parseStringPromise } from 'xml2js';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { IEffectMap } from '../mapping/json';
-import { EffectMapMapper } from '../mapping/mappers';
-import { FileUtilities } from '../utils/FileUtilities';
+import { Configuration, EffectMapMapper, FileUtilities, IConverter, IEffectMap } from '../common';
@singleton()
-export class EffectMapConverter extends Converter
+export class EffectMapConverter implements IConverter
{
- public effectMap: IEffectMap = null;
+ private _effectMap: IEffectMap = null;
constructor(
private readonly _configuration: Configuration)
- {
- super();
- }
+ {}
- public async convertAsync(args: string[] = []): Promise
+ public async convertAsync(): Promise
{
const now = Date.now();
const spinner = ora('Preparing EffectMap').start();
const url = this._configuration.getValue('effectmap.load.url');
const content = await FileUtilities.readFileAsString(url);
- if(!content.startsWith('{'))
- {
- const xml = await parseStringPromise(content.replace(/&/g,'&'));
+ this._effectMap = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content));
- this.effectMap = await this.mapXML2JSON(xml);
- }
- else
- {
- this.effectMap = JSON.parse(content);
- }
-
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata');
+ const directory = await FileUtilities.getDirectory('./assets/gamedata');
const path = directory.path + '/EffectMap.json';
- await writeFile(path, JSON.stringify(this.effectMap), 'utf8');
+ await writeFile(path, JSON.stringify(this._effectMap), 'utf8');
- spinner.succeed(`EffectMap finished in ${ Date.now() - now }ms`);
+ spinner.succeed(`EffectMap: Finished in ${ Date.now() - now }ms`);
}
private async mapXML2JSON(xml: any): Promise
@@ -55,4 +40,16 @@ export class EffectMapConverter extends Converter
return output;
}
+
+ public async getClassNamesAndRevisions(): Promise<{ [index: string]: string }>
+ {
+ const entries: { [index: string]: string } = {};
+
+ if(this._effectMap.effects)
+ {
+ for(const library of this._effectMap.effects) entries[library.lib] = '-1';
+ }
+
+ return entries;
+ }
}
diff --git a/src/converters/ExternalTextsConverter.ts b/src/converters/ExternalTextsConverter.ts
index 7115d22..c3a0b68 100644
--- a/src/converters/ExternalTextsConverter.ts
+++ b/src/converters/ExternalTextsConverter.ts
@@ -1,44 +1,32 @@
import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
+import ora from 'ora';
import { singleton } from 'tsyringe';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { IExternalTexts } from '../mapping/json';
-import { FileUtilities } from '../utils/FileUtilities';
+import { Configuration, FileUtilities, IConverter, IExternalTexts } from '../common';
@singleton()
-export class ExternalTextsConverter extends Converter
+export class ExternalTextsConverter implements IConverter
{
public externalTexts: IExternalTexts = null;
constructor(
private readonly _configuration: Configuration)
- {
- super();
- }
+ {}
- public async convertAsync(args: string[] = []): Promise
+ public async convertAsync(): Promise
{
const now = Date.now();
const spinner = ora('Preparing ExternalTexts').start();
const url = this._configuration.getValue('external.texts.url');
const content = await FileUtilities.readFileAsString(url);
- if(!content.startsWith('{'))
- {
- this.externalTexts = await this.mapText2JSON(content);
- }
- else
- {
- this.externalTexts = JSON.parse(content);
- }
+ this.externalTexts = ((!content.startsWith('{')) ? await this.mapText2JSON(content) : JSON.parse(content));
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata');
+ const directory = await FileUtilities.getDirectory('./assets/gamedata');
const path = directory.path + '/ExternalTexts.json';
await writeFile(path, JSON.stringify(this.externalTexts), 'utf8');
- spinner.succeed(`ExternalTexts finished in ${ Date.now() - now }ms`);
+ spinner.succeed(`ExternalTexts: Finished in ${ Date.now() - now }ms`);
}
private async mapText2JSON(text: string): Promise
@@ -47,15 +35,20 @@ export class ExternalTextsConverter extends Converter
const output: IExternalTexts = {};
- const parts = text.split(/\n\r{1,}|\n{1,}|\r{1,}/mg);
+ const parts = text.split(/\r?\n/);
for(const part of parts)
{
- const [ key, value ] = part.split('=');
+ const [ key, ...value ] = part.split('=');
- output[key] = value;
+ output[key] = value.join();
}
return output;
}
+
+ public get converterType(): string
+ {
+ return 'ExternalTexts';
+ }
}
diff --git a/src/converters/FigureConverter.ts b/src/converters/FigureConverter.ts
deleted file mode 100644
index ae412f7..0000000
--- a/src/converters/FigureConverter.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
-import { singleton } from 'tsyringe';
-import { BundleProvider } from '../common/bundle/BundleProvider';
-import { Configuration } from '../common/config/Configuration';
-import { SWFConverter } from '../common/converters/SWFConverter';
-import { SWFDownloader } from '../common/SWFDownloader';
-import { File } from '../utils/File';
-import { FileUtilities } from '../utils/FileUtilities';
-import { FigureMapConverter } from './FigureMapConverter';
-
-@singleton()
-export class FigureConverter
-{
- public figureTypes: Map = new Map();
-
- constructor(
- private readonly _figureMapConverter: FigureMapConverter,
- private readonly _configuration: Configuration)
- {}
-
- public async convertAsync(args: string[] = []): Promise
- {
- if(!this._configuration.getBoolean('convert.figure')) return;
-
- const now = Date.now();
- const spinner = ora('Preparing Figure').start();
- const baseUrl = this._configuration.getValue('dynamic.download.figure.url');
- const figureMap = this._figureMapConverter.figureMap;
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'figure');
- const classNames: string[] = [];
-
- if(figureMap.libraries !== undefined)
- {
- for(const library of figureMap.libraries)
- {
- const className = library.id.split('*')[0];
-
- if(className === 'hh_human_fx' || className === 'hh_pets') continue;
-
- if(classNames.indexOf(className) >= 0) continue;
-
- classNames.push(className);
-
- this.figureTypes.set(className, library.parts[0].type);
- }
- }
-
- for(const className of classNames)
- {
- try
- {
- const path = new File(directory.path + '/' + className + '.nitro');
-
- if(path.exists()) continue;
-
- const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1);
-
- if(!habboAssetSWF)
- {
- spinner.text = 'Couldnt convert figure: ' + className;
-
- spinner.render();
-
- continue;
- }
- else
- {
- spinner.text = 'Converting: ' + className;
-
- spinner.render();
- }
-
- const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF);
- const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, className);
-
- if(assetData)
- {
- assetData.name = className;
- assetData.type = this.figureTypes.get(className);
- }
-
- const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle);
-
- await writeFile(path.path, await nitroBundle.toBufferAsync());
-
- spinner.text = 'Finished: ' + className;
-
- spinner.render();
- }
-
- catch (error)
- {
- spinner.text = `Error converting ${ className }: ${ error.message }`;
-
- spinner.render();
-
- continue;
- }
- }
-
- console.log();
- spinner.succeed(`Figures finished in ${ Date.now() - now }ms`);
- }
-}
diff --git a/src/converters/FigureDataConverter.ts b/src/converters/FigureDataConverter.ts
index 76b5e07..f0cde00 100644
--- a/src/converters/FigureDataConverter.ts
+++ b/src/converters/FigureDataConverter.ts
@@ -1,48 +1,33 @@
import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
+import ora from 'ora';
import { singleton } from 'tsyringe';
import { parseStringPromise } from 'xml2js';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { IFigureData } from '../mapping/json/figuredata/IFigureData';
-import { FigureDataMapper } from '../mapping/mappers/FigureDataMapper';
-import { FileUtilities } from '../utils/FileUtilities';
+import { Configuration, FigureDataMapper, FileUtilities, IConverter, IFigureData } from '../common';
@singleton()
-export class FigureDataConverter extends Converter
+export class FigureDataConverter implements IConverter
{
public figureData: IFigureData = null;
constructor(
private readonly _configuration: Configuration)
- {
- super();
- }
+ {}
- public async convertAsync(args: string[] = []): Promise
+ public async convertAsync(): Promise
{
const now = Date.now();
const spinner = ora('Preparing FigureData').start();
const url = this._configuration.getValue('figuredata.load.url');
const content = await FileUtilities.readFileAsString(url);
- if(!content.startsWith('{'))
- {
- const xml = await parseStringPromise(content.replace(/&/g,'&'));
+ this.figureData = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content));
- this.figureData = await this.mapXML2JSON(xml);
- }
- else
- {
- this.figureData = JSON.parse(content);
- }
-
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata');
+ const directory = await FileUtilities.getDirectory('./assets/gamedata');
const path = directory.path + '/FigureData.json';
await writeFile(path, JSON.stringify(this.figureData), 'utf8');
- spinner.succeed(`FigureData finished in ${ Date.now() - now }ms`);
+ spinner.succeed(`FigureData: Finished in ${ Date.now() - now }ms`);
}
private async mapXML2JSON(xml: any): Promise
@@ -55,4 +40,9 @@ export class FigureDataConverter extends Converter
return output;
}
+
+ public get converterType(): string
+ {
+ return 'FigureData';
+ }
}
diff --git a/src/converters/FigureMapConverter.ts b/src/converters/FigureMapConverter.ts
index f087c79..45bfda2 100644
--- a/src/converters/FigureMapConverter.ts
+++ b/src/converters/FigureMapConverter.ts
@@ -1,50 +1,33 @@
import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
+import ora from 'ora';
import { singleton } from 'tsyringe';
import { parseStringPromise } from 'xml2js';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { IFigureMap } from '../mapping/json';
-import { FigureMapMapper } from '../mapping/mappers';
-import { FileUtilities } from '../utils/FileUtilities';
-import { Logger } from '../utils/Logger';
+import { Configuration, FigureMapMapper, FileUtilities, IConverter, IFigureMap } from '../common';
@singleton()
-export class FigureMapConverter extends Converter
+export class FigureMapConverter implements IConverter
{
- public figureMap: IFigureMap = null;
+ private _figureMap: IFigureMap = null;
constructor(
- private readonly _configuration: Configuration,
- private readonly _logger: Logger)
- {
- super();
- }
+ private readonly _configuration: Configuration)
+ {}
- public async convertAsync(args: string[] = []): Promise
+ public async convertAsync(): Promise
{
const now = Date.now();
const spinner = ora('Preparing FigureMap').start();
const url = this._configuration.getValue('figuremap.load.url');
const content = await FileUtilities.readFileAsString(url);
- if(!content.startsWith('{'))
- {
- const xml = await parseStringPromise(content.replace(/&/g,'&'));
+ this._figureMap = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content));
- this.figureMap = await this.mapXML2JSON(xml);
- }
- else
- {
- this.figureMap = JSON.parse(content);
- }
-
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata');
+ const directory = await FileUtilities.getDirectory('./assets/gamedata');
const path = directory.path + '/FigureMap.json';
- await writeFile(path, JSON.stringify(this.figureMap), 'utf8');
+ await writeFile(path, JSON.stringify(this._figureMap), 'utf8');
- spinner.succeed(`FigureMap finished in ${ Date.now() - now }ms`);
+ spinner.succeed(`FigureMap: Finished in ${ Date.now() - now }ms`);
}
private async mapXML2JSON(xml: any): Promise
@@ -57,4 +40,23 @@ export class FigureMapConverter extends Converter
return output;
}
+
+ public async getClassNamesAndRevisions(): Promise<{ [index: string]: string }>
+ {
+ const entries: { [index: string]: string } = {};
+
+ if(this._figureMap.libraries)
+ {
+ for(const library of this._figureMap.libraries)
+ {
+ const className = library.id.split('*')[0];
+
+ if(className === 'hh_human_fx' || className === 'hh_pets') continue;
+
+ entries[className] = '-1';
+ }
+ }
+
+ return entries;
+ }
}
diff --git a/src/converters/FurnitureConverter.ts b/src/converters/FurnitureConverter.ts
deleted file mode 100644
index d0972e0..0000000
--- a/src/converters/FurnitureConverter.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
-import { singleton } from 'tsyringe';
-import { BundleProvider } from '../common/bundle/BundleProvider';
-import { Configuration } from '../common/config/Configuration';
-import { SWFConverter } from '../common/converters/SWFConverter';
-import { SWFDownloader } from '../common/SWFDownloader';
-import { IAssetData } from '../mapping/json';
-import { File } from '../utils/File';
-import { FileUtilities } from '../utils/FileUtilities';
-import { FurnitureDataConverter } from './FurnitureDataConverter';
-
-@singleton()
-export class FurnitureConverter
-{
- public assets: Map = new Map();
-
- constructor(
- private readonly _furniDataConverter: FurnitureDataConverter,
- private readonly _configuration: Configuration)
- {}
-
- public async convertAsync(args: string[] = []): Promise
- {
- if(!this._configuration.getBoolean('convert.furniture')) return;
-
- const now = Date.now();
- const spinner = ora('Preparing Furniture').start();
- const baseUrl = this._configuration.getValue('dynamic.download.furniture.url');
- const furniData = this._furniDataConverter.furnitureData;
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'furniture');
- const classNames: string[] = [];
- const revisions: number[] = [];
-
- if(furniData.roomitemtypes)
- {
- if(furniData.roomitemtypes.furnitype)
- {
- for(const furniType of furniData.roomitemtypes.furnitype)
- {
- const className = furniType.classname.split('*')[0];
- const revision = furniType.revision;
-
- if(classNames.indexOf(className) >= 0) continue;
-
- classNames.push(className);
- revisions.push(revision);
- }
- }
- }
-
- if(furniData.wallitemtypes)
- {
- if(furniData.wallitemtypes.furnitype)
- {
- for(const furniType of furniData.wallitemtypes.furnitype)
- {
- const className = furniType.classname.split('*')[0];
- const revision = furniType.revision;
-
- if(classNames.indexOf(className) >= 0) continue;
-
- classNames.push(className);
- revisions.push(revision);
- }
- }
- }
-
- for(let i = 0; i < classNames.length; i++)
- {
- const className = classNames[i];
- const revision = revisions[i];
-
- try
- {
- const path = new File(directory.path + '/' + className + '.nitro');
-
- if(path.exists()) continue;
-
- const habboAssetSWF = await SWFDownloader.download(baseUrl, className, revision);
-
- if(!habboAssetSWF)
- {
- spinner.text = 'Couldnt convert furni: ' + className;
-
- spinner.render();
-
- continue;
- }
- else
- {
- spinner.text = 'Couldnt convert furni: ' + className;
-
- spinner.render();
- }
-
- const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF);
- const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, 'furniture');
- const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle);
-
- await writeFile(path.path, await nitroBundle.toBufferAsync());
-
- spinner.text = 'Finished: ' + className;
-
- spinner.render();
- }
-
- catch (error)
- {
- spinner.text = `Error converting ${ className }: ${ error.message }`;
-
- spinner.render();
-
- continue;
- }
- }
-
- console.log();
- spinner.succeed(`Furniture finished in ${ Date.now() - now }ms`);
- }
-}
diff --git a/src/converters/FurnitureDataConverter.ts b/src/converters/FurnitureDataConverter.ts
index 9038240..7ae17f5 100644
--- a/src/converters/FurnitureDataConverter.ts
+++ b/src/converters/FurnitureDataConverter.ts
@@ -1,49 +1,33 @@
import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
+import ora from 'ora';
import { singleton } from 'tsyringe';
import { parseStringPromise } from 'xml2js';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { IFurnitureData } from '../mapping/json';
-import { FurnitureDataMapper } from '../mapping/mappers';
-import { FileUtilities } from '../utils/FileUtilities';
+import { Configuration, FileUtilities, FurnitureDataMapper, IConverter, IFurnitureData } from '../common';
@singleton()
-export class FurnitureDataConverter extends Converter
+export class FurnitureDataConverter implements IConverter
{
public furnitureData: IFurnitureData = null;
constructor(
private readonly _configuration: Configuration)
- {
- super();
- }
+ {}
- public async convertAsync(args: string[] = []): Promise
+ public async convertAsync(): Promise
{
const now = Date.now();
const spinner = ora('Preparing FurnitureData').start();
const url = this._configuration.getValue('furnidata.load.url');
const content = await FileUtilities.readFileAsString(url);
- if(!content.startsWith('{'))
- {
- const xml = await parseStringPromise(content.replace(/&/g,'&'));
- const furnitureData = await this.mapXML2JSON(xml);
+ this.furnitureData = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content));
- this.furnitureData = furnitureData;
- }
- else
- {
- this.furnitureData = JSON.parse(content);
- }
-
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata');
+ const directory = await FileUtilities.getDirectory('./assets/gamedata');
const path = directory.path + '/FurnitureData.json';
await writeFile(path, JSON.stringify(this.furnitureData), 'utf8');
- spinner.succeed(`FurnitureData finished in ${ Date.now() - now }ms`);
+ spinner.succeed(`FurnitureData: Finished in ${ Date.now() - now }ms`);
}
private async mapXML2JSON(xml: any): Promise
@@ -56,4 +40,47 @@ export class FurnitureDataConverter extends Converter
return output;
}
+
+ public async getClassNamesAndRevisions(floorOnly: boolean = false, wallOnly: boolean = false): Promise<{ [index: string]: string }>
+ {
+ if(!this.furnitureData) return null;
+
+ const both = (!floorOnly && !wallOnly);
+ const entries: { [index: string]: string } = {};
+
+ if((both || floorOnly) && this.furnitureData.roomitemtypes)
+ {
+ if(this.furnitureData.roomitemtypes.furnitype)
+ {
+ for(const furniType of this.furnitureData.roomitemtypes.furnitype)
+ {
+ const className = furniType.classname.split('*')[0];
+ const revision = furniType.revision;
+
+ entries[className] = revision.toString();
+ }
+ }
+ }
+
+ if((both || wallOnly) && this.furnitureData.wallitemtypes)
+ {
+ if(this.furnitureData.wallitemtypes.furnitype)
+ {
+ for(const furniType of this.furnitureData.wallitemtypes.furnitype)
+ {
+ const className = furniType.classname.split('*')[0];
+ const revision = furniType.revision;
+
+ entries[className] = revision.toString();
+ }
+ }
+ }
+
+ return entries;
+ }
+
+ public get converterType(): string
+ {
+ return 'FurnitureData';
+ }
}
diff --git a/src/converters/OldAssetConverter.ts b/src/converters/OldAssetConverter.ts
deleted file mode 100644
index 90c25bf..0000000
--- a/src/converters/OldAssetConverter.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { writeFile } from 'fs/promises';
-import { singleton } from 'tsyringe';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { File } from '../utils/File';
-import { FileUtilities } from '../utils/FileUtilities';
-import { Logger } from '../utils/Logger';
-import { NitroBundle } from '../utils/NitroBundle';
-
-@singleton()
-export class OldAssetConverter extends Converter
-{
- constructor(
- private readonly _configuration: Configuration,
- private readonly _logger: Logger)
- {
- super();
- }
-
- public async convertAsync(args: string[] = []): Promise
- {
- if(args.shift() !== 'old-asset') return;
-
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'generic');
- const baseDirectory = FileUtilities.getDirectory(args.shift());
-
- for(const className of args)
- {
- try
- {
- const path = new File(directory.path + '/' + className + '.nitro');
- const jsonBuffer = await FileUtilities.readFileAsBuffer(baseDirectory.path + '/' + className + '/' + className + '.json');
- const imageBuffer = await FileUtilities.readFileAsBuffer(baseDirectory.path + '/' + className + '/' + className + '.png');
- const nitroBundle = new NitroBundle();
-
- nitroBundle.addFile((className + '.json'), jsonBuffer);
- nitroBundle.addFile((className + '.png'), imageBuffer);
-
- await writeFile(path.path, await nitroBundle.toBufferAsync());
-
- console.log('Finished converting: ' + className);
- }
-
- catch (error)
- {
- console.log('Error converting: ' + className);
- }
- }
- }
-}
diff --git a/src/converters/PetConverter.ts b/src/converters/PetConverter.ts
deleted file mode 100644
index b2be9da..0000000
--- a/src/converters/PetConverter.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
-import { singleton } from 'tsyringe';
-import { BundleProvider } from '../common/bundle/BundleProvider';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { SWFConverter } from '../common/converters/SWFConverter';
-import { SWFDownloader } from '../common/SWFDownloader';
-import { File } from '../utils/File';
-import { FileUtilities } from '../utils/FileUtilities';
-import { Logger } from '../utils/Logger';
-
-@singleton()
-export class PetConverter extends Converter
-{
- constructor(
- private readonly _configuration: Configuration,
- private readonly _logger: Logger)
- {
- super();
- }
-
- public async convertAsync(args: string[] = []): Promise
- {
- if(!this._configuration.getBoolean('convert.pet')) return;
-
- const now = Date.now();
- const spinner = ora('Preparing Pets').start();
- const baseUrl = this._configuration.getValue('dynamic.download.pet.url');
- const classNames = this.getPetTypes();
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'pet');
-
- for(const className of classNames)
- {
- try
- {
- const path = new File(directory.path + '/' + className + '.nitro');
-
- if(path.exists()) continue;
-
- const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1);
-
- if(!habboAssetSWF)
- {
- spinner.text = 'Couldnt convert pet: ' + className;
-
- spinner.render();
-
- continue;
- }
- else
- {
- spinner.text = 'Converting: ' + className;
-
- spinner.render();
- }
-
- const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF);
- const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, 'pet');
- const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle);
-
- await writeFile(path.path, await nitroBundle.toBufferAsync());
-
- spinner.text = 'Finished: ' + className;
-
- spinner.render();
- }
-
- catch (error)
- {
- spinner.text = `Error converting ${ className }: ${ error.message }`;
-
- spinner.render();
-
- continue;
- }
- }
-
- console.log();
- spinner.succeed(`Pets finished in ${ Date.now() - now }ms`);
- }
-
- private getPetTypes(): string[]
- {
- const petTypes: string[] = [];
-
- const pets = this._configuration.getValue('pet.configuration');
-
- if(pets)
- {
- const types = pets.split(',');
-
- for(const type of types) petTypes.push(type);
- }
-
- return petTypes;
- }
-}
diff --git a/src/converters/ProductDataConverter.ts b/src/converters/ProductDataConverter.ts
index acfb0a6..86587df 100644
--- a/src/converters/ProductDataConverter.ts
+++ b/src/converters/ProductDataConverter.ts
@@ -1,21 +1,16 @@
import { writeFile } from 'fs/promises';
-import * as ora from 'ora';
+import ora from 'ora';
import { singleton } from 'tsyringe';
-import { Configuration } from '../common/config/Configuration';
-import { Converter } from '../common/converters/Converter';
-import { IProductData } from '../mapping/json';
-import { FileUtilities } from '../utils/FileUtilities';
+import { Configuration, FileUtilities, IConverter, IProductData } from '../common';
@singleton()
-export class ProductDataConverter extends Converter
+export class ProductDataConverter implements IConverter
{
public productData: IProductData = null;
constructor(
private readonly _configuration: Configuration)
- {
- super();
- }
+ {}
public async convertAsync(args: string[] = []): Promise
{
@@ -24,23 +19,14 @@ export class ProductDataConverter extends Converter
const url = this._configuration.getValue('productdata.load.url');
const content = await FileUtilities.readFileAsString(url);
- if(!content.startsWith('{'))
- {
- const productData = await this.mapText2JSON(content);
+ this.productData = ((!content.startsWith('{')) ? await this.mapText2JSON(content) : JSON.parse(content));
- this.productData = productData;
- }
- else
- {
- this.productData = JSON.parse(content);
- }
-
- const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata');
+ const directory = await FileUtilities.getDirectory('./assets/gamedata');
const path = directory.path + '/ProductData.json';
await writeFile(path, JSON.stringify(this.productData), 'utf8');
- spinner.succeed(`ProductData finished in ${ Date.now() - now }ms`);
+ spinner.succeed(`ProductData: Finished in ${ Date.now() - now }ms`);
}
private async mapText2JSON(text: string): Promise
@@ -83,4 +69,9 @@ export class ProductDataConverter extends Converter
return output;
}
+
+ public get converterType(): string
+ {
+ return 'ProductData';
+ }
}
diff --git a/src/swf-reader/index.js b/src/swf-reader/index.js
deleted file mode 100644
index b24740b..0000000
--- a/src/swf-reader/index.js
+++ /dev/null
@@ -1,491 +0,0 @@
-/**
- * Simple module for reading SWF properties
- *
- * (c) 2014 Rafael Leal Dias
- * MIT LICENCE
- *
- */
-const fs = require('fs');
-const zlib = require('zlib');
-const lzma = require('lzma-purejs');
-const Stream = require('stream');
-const SWFTags = require('./lib/swf-tags');
-const SWFReader = exports;
-import { SWFBuffer } from './lib/SWFBuffer';
-
-function readSWFTags(buff, swf)
-{
- var tags = []
- , tag
- , tagHeader
- , flag
- , l
- , sc
- , fc;
-
- /* Reads TagCodeAndLength from Tag's RECORDHEADER */
- while( (tagHeader = buff.readTagCodeAndLength()) )
- {
- tag = {
- header : tagHeader
- };
- switch( tagHeader.code )
- {
- case SWFTags.FileAttributes: {
- const flag = buff.readUIntLE(32);
- const fileAttrs = {};
-
- fileAttrs.useNetwork = tag.useNetwork = !!(flag & 0x1);
- fileAttrs.as3 = tag.as3 = !!(flag & 0x8);
- fileAttrs.hasMetaData = tag.hasMetaData = !!(flag & 0x10);
- fileAttrs.useGPU = tag.useGPU = !!(flag & 0x20);
- fileAttrs.useDirectBit = tag.useDirectBlit = !!(flag & 0x40);
-
- swf.fileAttributes = fileAttrs;
- break;
- }
- case SWFTags.Metadata: {
- swf.metadata = tag.metadata = buff.readString();
- break;
- }
- case SWFTags.SetBackgroundColor: {
- tag.RGB = buff.readRGB();
- swf.backgroundColor = '#' + (tag.RGB[0]*65536 + tag.RGB[1]*256 + tag.RGB[0]).toString(16);
- break;
- }
- case SWFTags.Protect :
- swf.protect = tagHeader.length && buff.readString();
- break;
- case SWFTags.DefineSceneAndFrameLabelData :
- sc = tag.sceneCount = buff.readEncodedU32();
- tag.scenes = [];
-
- while(sc--)
- tag.scenes.push({
- offset : buff.readEncodedU32(),
- name : buff.readString()
- });
-
- fc = tag.frameLabelCount = buff.readEncodedU32();
- tag.labels = [];
-
- while(fc--)
- tag.labels.push({
- frameNum : buff.readEncodedU32(),
- frameLabel : buff.readString()
- });
- break;
- /**
- * DefineShape4 extends the capabilities of
- * DefineShape3 by using a new line style
- * record in the shape
- */
- //case SWFTags.DefineShape4 :
- // /* id for this character */
- // tag.ShapeId = buff.readUIntLE(16);
- // /* bounds of the shape */
- // tag.ShapeBounds = buff.readRect();
- // /* bounds of the shape, excluding the strokes */
- // tag.EdgeBounds = buff.readRect();
- // /* reserved, must be 0 */
- // if (0 !== buff.readBits(5))
- // throw new Error('Reserved bit used.');
- // /* if 1, use fill winding. >= SWF 10 */
- // if (swf.version >= 10)
- // tag.UsesFillWindingRule = buff.readBits(1);
- // /**
- // * if 1, shape contains at least one
- // * non-scaling stroke.
- // */
- // tag.UsesNonScallingStrokes = buff.readBits(1);
- // /**
- // * if 1, shape contains at least one
- // * scaling stroke
- // */
- // tag.UsesScalingStrokes = buff.readBits(1);
- // tag.shapes = buff.readShapeWithStyle();
- // break;
- case SWFTags.FrameLabel :
- tag.name = buff.readString();
- l = Buffer.byteLength(tag.name);
- /* check if it's an named anchor */
- if(l & (tagHeader.length - 1) != l)
- tag.anchor = buff.readUInt8();
- break;
- case SWFTags.DefineSprite :
- tag.SpriteID = buff.readUIntLE(16);
- tag.FrameCount = buff.readUIntLE(16);
- tag.ControlTags = readSWFTags(buff, swf);
- break;
- case SWFTags.ExportAssets :
- tag.count = buff.readUIntLE(16);
- tag.assets = [];
-
- l = 0;
-
- while(l++ < tag.count)
- tag.assets.push({
- id : buff.readUIntLE(16),
- name : buff.readString()
- });
- break;
- case SWFTags.ImportAssets :
- /**
- * URL where the source SWF file can be found
- */
- tag.url = buff.readString();
- /**
- * Number of assets to import
- */
- tag.count = buff.readUIntLE(16);
- tag.assets = [];
-
- l = 0;
-
- while(l++ < tag.count)
- tag.assets.push({
- /**
- * Character ID for the l-th item
- * in importing SWF file
- */
- id : buff.readUIntLE(16),
- /**
- * Identifies for the l-th
- * imported character
- */
- name : buff.readString()
- });
- break;
- case SWFTags.ImportAssets2 :
- tag.url = buff.readString();
-
- if( !(1 === buff.readUInt8() && 0 === buff.readUInt8()) )
- {
- throw new Error('Reserved bits for ImportAssets2 used');
- }
-
- tag.count = buff.readUIntLE(16);
- tag.assets = [];
-
- l = 0;
-
- while(l++ < tag.count)
- tag.assets({
- id : buff.readUIntLE(16),
- name : buff.readString()
- });
- break;
- case SWFTags.EnableDebbuger :
- tag.password = buff.readString();
- break;
- case SWFTags.EnableDebugger2 :
- if(0 !== buff.readUIntLE(16))
- {
- //throw new Error('Reserved bit for EnableDebugger2 used.');
- }
- tag.password = buff.readString();
- break;
- case SWFTags.ScriptLimits :
- /**
- * Maximum recursion Depth
- */
- tag.maxRecursionDepth = buff.readUIntLE(16);
- /**
- * Maximum ActionScript processing time before script
- * stuck dialog box displays
- */
- tag.scriptTimeoutSeconds = buff.readUIntLE(16);
- break;
- case SWFTags.SymbolClass: {
- tag.numSymbols = buff.readUIntLE(16);
- tag.symbols = [];
-
- l = 0;
-
- while(l++ < tag.numSymbols)
- tag.symbols.push({
- id : buff.readUIntLE(16),
- name : buff.readString()
- });
- break;
- }
- case SWFTags.DefineScalingGrid: {
- tag.characterId = buff.readUIntLE(16);
- tag.splitter = buff.readRect();
- break;
- }
- case SWFTags.setTabIndex: {
- tag.depth = buff.readUIntLE(16);
- tag.tabIndex = buff.readUIntLE(16);
- break;
- }
- case SWFTags.JPEGTables: {
- tag.jpegData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length);
- buff.pointer += tagHeader.length;
- break;
- }
- case SWFTags.DefineBits: {
- tag.characterId = buff.readUIntLE(16);
- tag.jpegData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length - 2);
- buff.pointer += tagHeader.length - 2;
- break;
- }
- case SWFTags.DefineBitsJPEG2: {
- tag.characterId = buff.readUIntLE(16);
- tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length - 2);
- buff.pointer += tagHeader.length - 2;
- break;
- }
- case SWFTags.DefineBitsJPEG3: {
- tag.characterId = buff.readUIntLE(16);
- var alphaDataOffset = buff.readUIntLE(32);
- tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + alphaDataOffset);
- buff.pointer += alphaDataOffset;
- var restLength = tagHeader.length - 6 - alphaDataOffset;
- tag.bitmapAlphaData = buff.buffer.slice(buff.pointer, buff.pointer + restLength);
- buff.pointer += restLength;
- break;
- }
- case SWFTags.DefineBitsJPEG4: {
- tag.characterId = buff.readUIntLE(16);
- const alphaDataOffset = buff.readUIntLE(32);
- tag.deblockParam = buff.readUIntLE(16);
- tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + alphaDataOffset);
- buff.pointer += alphaDataOffset;
- const restLength = tagHeader.length - 8 - alphaDataOffset;
- tag.bitmapAlphaData = buff.buffer.slice(buff.pointer, buff.pointer + restLength);
- buff.pointer += restLength;
- break;
- }
- case SWFTags.DefineBitsLossless:
- case SWFTags.DefineBitsLossless2: {
- tag.characterId = buff.readUIntLE(16);
- tag.bitmapFormat = buff.readUInt8();
- tag.bitmapWidth = buff.readUIntLE(16);
- tag.bitmapHeight = buff.readUIntLE(16);
- let restLength = tagHeader.length - 7;
- if(tag.bitmapFormat == 3)
- {
- tag.bitmapColorTableSize = buff.readUInt8();
- restLength--;
- }
- tag.zlibBitmapData = buff.buffer.slice(buff.pointer, buff.pointer + restLength);
- buff.pointer += restLength;
- break;
- }
- default:
- tag.data = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length);
- buff.pointer += tagHeader.length;
- break;
- }
- tags.push(tag);
- }
- return tags;
-}
-
-/**
- * Reads tags and their contents, passaing a SWF object to callback
- *
- * @param {SWFBuffer} buff
- * @param {Buffer} compressed_buff
- * @param {function} callback
- * @api private
- *
- */
-function readSWFBuff(buff, compressed_buff, next)
-{
- if(!buff) return next(null, null);
-
- buff.seek(3);// start
-
- if(buff.length < 9)
- {
- if(isSync) throw new Error('Buffer is to small, must be greater than 9 bytes.');
- return next(new Error('Buffer is to small, must be greater than 9 bytes.'));
- }
- var swf = {
- version : buff.readUInt8(),
- fileLength : {
- compressed : compressed_buff.length,
- uncompressed : buff.readUIntLE(32)
- },
- frameSize : buff.readRect(), // Returns a RECT object. i.e : { x : 0, y : 0, width : 200, height: 300 }
- frameRate : buff.readUIntLE(16)/256,
- frameCount : buff.readUIntLE(16)
- }
- , isSync = 'function' !== typeof next;
-
- try
- {
- swf.tags = readSWFTags(buff, swf);
- }
- catch (e)
- {
- if(isSync) throw e;
- return next(e);
- }
-
- return isSync && swf || next( null, swf );
-}
-
-/**
- * Concat SWF Header with uncompressed Buffer
- *
- * @param {Buffer|ArrayBuffer} buff
- * @param {Buffer|ArrayBuffer} swf
- */
-function concatSWFHeader(buff, swf)
-{
- return Buffer.concat([swf.slice(0, 8), buff]);
-}
-
-/**
- * Uncompress SWF and start reading it
- *
- * @param {Buffer|ArrayBuffer} swf
- * @param {function} callback
- *
- */
-function uncompress(swf, next)
-{
- var compressed_buff = swf.slice(8)
- , uncompressed_buff
- , isSync = 'function' !== typeof next
- , e;
-
- // uncompress buffer
- switch(swf[0])
- {
- case 0x43 : // zlib compressed
- if(isSync)
- {
- uncompressed_buff = concatSWFHeader(zlib.unzipSync(compressed_buff), swf);
-
- if(!Buffer.isBuffer(uncompressed_buff)) return null;
-
- return readSWFBuff(new SWFBuffer(uncompressed_buff), swf);
- }
-
- zlib.inflate(compressed_buff, function(err, buf)
- {
- if(!Buffer.isBuffer(buf))
- {
- readSWFBuff(null, swf, next);
- }
- else
- {
- readSWFBuff(new SWFBuffer(buf), swf, next);
- }
- });
- break;
- case 0x46 : // uncompressed
- if(!Buffer.isBuffer(swf)) return null;
-
- return readSWFBuff(new SWFBuffer( swf ), swf, next);
- case 0x5a : // LZMA compressed
- var lzmaProperties = compressed_buff.slice(4, 9);
- compressed_buff = compressed_buff.slice(9);
-
- var input_stream = new Stream();
- input_stream.pos = 0;
- input_stream.readByte = function()
- {
- return this.pos >= compressed_buff.length ? -1 : compressed_buff[this.pos++];
- };
-
- var output_stream = new Stream();
- output_stream.buffer = new Buffer(16384);
- output_stream.pos = 0;
- output_stream.writeByte = function(_byte)
- {
- if(this.pos >= this.buffer.length)
- {
- var newBuffer = new Buffer(this.buffer.length * 2);
- this.buffer.copy(newBuffer);
- this.buffer = newBuffer;
- }
- this.buffer[this.pos++] = _byte;
- };
- output_stream.getBuffer = function()
- {
- // trim buffer
- if(this.pos !== this.buffer.length)
- {
- var newBuffer = new Buffer(this.pos);
- this.buffer.copy(newBuffer, 0, 0, this.pos);
- this.buffer = newBuffer;
- }
- return this.buffer;
- };
-
- lzma.decompress(lzmaProperties, input_stream, output_stream, -1);
- uncompressed_buff = Buffer.concat([swf.slice(0, 8), output_stream.getBuffer()]);
-
- if(!Buffer.isBuffer(uncompressed_buff)) return null;
-
- return readSWFBuff(new SWFBuffer(uncompressed_buff), swf, next);
- default :
- e = new Error('Unknown SWF compressions');
-
- if(isSync)
- {
- throw e;
- }
- else
- {
- next(e);
- }
- }
-}
-
-/**
- * Check if file is Buffer or ArrayBuffer
- *
- * @param {Buffer|ArrayBuffer) b
- * @api private
- *
- */
-function isBuffer(b)
-{
- return typeof Buffer !== 'undefined' && Buffer.isBuffer(b) || b instanceof ArrayBuffer;
-}
-
-/* Exposes Tags constants */
-SWFReader.TAGS = SWFTags;
-
-/**
- * Reads SWF file
- *
- * @param {String|Buffer}} file
- * @param {function} next - if not a function, uses synchronous algorithm
- * @api public
- *
- */
-SWFReader.read = SWFReader.readSync = function(file, next)
-{
- if(isBuffer(file))
- {
- /* File is already a buffer */
- return uncompress(file, next);
- }
- else
- {
- /* Get the buffer */
- if('function' === typeof next)
- {
- fs.readFile(file, function(err, swf)
- {
- if( err )
- {
- next(err);
- return;
- }
- uncompress(swf, next);
- });
- }
- else
- {
- return uncompress(fs.readFileSync(file));
- }
- }
-};
diff --git a/src/swf-reader/lib/swf-tags.js b/src/swf-reader/lib/swf-tags.js
deleted file mode 100644
index 26a6dd0..0000000
--- a/src/swf-reader/lib/swf-tags.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Defines constants on exports object
- *
- * @param {String} name
- * @param {Mixed} value
- */
-
-function define(name, value)
-{
- Object.defineProperty(exports, name, {
- value : value,
- enumerable : true
- });
-}
-
-/* SWF Tags Type */
-
-define('End', 0);
-define('ShowFrame', 1);
-define('DefineShape', 2);
-define('PlaceObject', 4);
-define('RemoveObject', 5);
-define('DefineBits', 6);
-define('DefineButton', 7);
-define('JPEGTables', 8);
-define('SetBackgroundColor', 9);
-define('DefineFont', 10);
-define('DefineText', 11);
-define('DoAction', 12);
-define('DefineFontInfo', 13);
-define('DefineSound', 14);
-define('StartSound', 15);
-define('DefineButtonSound', 17);
-define('SoundStreamHead', 18);
-define('SoundStreamBlock', 19);
-define('DefineBitsLossless', 20);
-define('DefineBitsJPEG2', 21);
-define('DefineShape2', 22);
-define('DefineButtonCxform', 23);
-define('Protect', 24);
-define('PlaceObject2', 26);
-define('RemoveObject2', 28);
-define('DefineShape3', 32);
-define('DefineText2', 33);
-define('DefineButton2', 34);
-define('DefineBitsJPEG3', 35);
-define('DefineBitsLossless2', 36);
-define('DefineEditText', 37);
-define('DefineSprite', 39);
-define('SerialNumber', 41);
-define('FrameLabel', 43);
-define('SoundStreamHead2', 45);
-define('DefineMorphShape', 46);
-define('DefineFont2', 48);
-define('ExportAssets', 56);
-define('ImportAssets', 57);
-define('EnableDebugger', 58);
-define('DoInitAction', 59);
-define('DefineVideoStream', 60);
-define('VideoFrame', 61);
-define('DefineFontInfo2', 62);
-define('EnableDebugger2', 64);
-define('ScriptLimits', 65);
-define('SetTabIndex', 66);
-define('FileAttributes', 69);
-define('PlaceObject3', 70);
-define('ImportAssets2', 71);
-define('DefineFontAlignZones', 73);
-define('CSMTextSettings', 74);
-define('DefineFont3', 75);
-define('SymbolClass', 76);
-define('Metadata', 77);
-define('DefineScalingGrid', 78);
-define('DoABC', 82);
-define('DefineShape4', 83);
-define('DefineMorphShape2', 84);
-define('DefineSceneAndFrameLabelData', 86);
-define('DefineBinaryData', 87);
-define('DefineFontName', 88);
-define('StartSound2', 89);
-define('DefineBitsJPEG4', 90);
-define('DefineFont4', 91);
-//define('TagMax' (DefineFont4 + 1)
diff --git a/src/swf/ConcatSWFHeader.ts b/src/swf/ConcatSWFHeader.ts
new file mode 100644
index 0000000..5e7f27d
--- /dev/null
+++ b/src/swf/ConcatSWFHeader.ts
@@ -0,0 +1,4 @@
+export const ConcatSWFHeader = (buff: Buffer, swf: Buffer) =>
+{
+ return Buffer.concat([ swf.slice(0, 8), buff ]);
+};
diff --git a/src/swf/GenerateNitroBundleFromSwf.ts b/src/swf/GenerateNitroBundleFromSwf.ts
new file mode 100644
index 0000000..82a2755
--- /dev/null
+++ b/src/swf/GenerateNitroBundleFromSwf.ts
@@ -0,0 +1,15 @@
+import { GenerateSpriteSheet } from './GenerateSpritesheet';
+import { HabboAssetSWF } from './HabboAssetSWF';
+import { SWFUtilities } from './SWFUtilities';
+
+export const GenerateNitroBundleFromSwf = async (habboAssetSWF: HabboAssetSWF, assetType: string = null) =>
+{
+ if(!habboAssetSWF) return null;
+
+ const spriteBundle = await GenerateSpriteSheet(habboAssetSWF);
+ const assetData = await SWFUtilities.mapXML2JSON(habboAssetSWF, assetType);
+
+ if(assetData) assetData.name = habboAssetSWF.getDocumentClass();
+
+ return SWFUtilities.createNitroBundle(assetData.name, assetData, spriteBundle);
+};
diff --git a/src/swf/GenerateSpritesheet.ts b/src/swf/GenerateSpritesheet.ts
new file mode 100644
index 0000000..9c2b552
--- /dev/null
+++ b/src/swf/GenerateSpritesheet.ts
@@ -0,0 +1,59 @@
+import { ImageBundle } from '../common';
+import { HabboAssetSWF } from './HabboAssetSWF';
+import { PackImages } from './PackImages';
+
+export const IMAGE_SOURCES: Map = new Map();
+
+export const GenerateSpriteSheet = async (habboAssetSWF: HabboAssetSWF, convertCase: boolean = false) =>
+{
+ const tagList = habboAssetSWF.symbolTags();
+ const names: string[] = [];
+ const tags: number[] = [];
+
+ let documentClass = habboAssetSWF.getDocumentClass();
+
+ if(convertCase) documentClass = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, ''))));
+
+ for(const tag of tagList)
+ {
+ names.push(...tag.names);
+ tags.push(...tag.tags);
+ }
+
+ const imageBundle = new ImageBundle();
+
+ const imageTags = habboAssetSWF.imageTags();
+
+ for(const imageTag of imageTags)
+ {
+ if(tags.includes(imageTag.characterId))
+ {
+ for(let i = 0; i < tags.length; i++)
+ {
+ if(tags[i] != imageTag.characterId) continue;
+
+ if(names[i] == imageTag.className) continue;
+
+ if(imageTag.className.startsWith('sh_')) continue;
+
+ if(imageTag.className.indexOf('_32_') >= 0) continue;
+
+ IMAGE_SOURCES.set(names[i].substring(documentClass.length + 1), imageTag.className.substring(documentClass.length + 1));
+ }
+ }
+
+ if(imageTag.className.startsWith('sh_')) continue;
+
+ if(imageTag.className.indexOf('_32_') >= 0) continue;
+
+ let className = imageTag.className;
+
+ if(convertCase) className = ((className.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1));
+
+ imageBundle.addImage(className, imageTag.imgData);
+ }
+
+ if(!imageBundle.images.length) return null;
+
+ return await PackImages(documentClass, imageBundle, convertCase);
+};
diff --git a/src/swf/HabboAssetSWF.ts b/src/swf/HabboAssetSWF.ts
index 732e3ae..e41a185 100644
--- a/src/swf/HabboAssetSWF.ts
+++ b/src/swf/HabboAssetSWF.ts
@@ -1,32 +1,27 @@
-import CustomIterator from '../utils/CustomIterator';
-import { readImagesDefineBitsLossless, readImagesJPEG3or4, readSwfAsync } from '../utils/SwfReader';
-import { CharacterTag } from './tags/CharacterTag';
-import { DefineBinaryDataTag } from './tags/DefineBinaryDataTag';
-import { ImageTag } from './tags/ImageTag';
-import { ITag } from './tags/ITag';
-import { SymbolClassTag } from './tags/SymbolClassTag';
+import { CustomIterator } from '../common';
+import { ReadImagesDefineBitsLossless } from './ReadImagesDefineBitsLossless';
+import { ReadImagesJPEG3or4 } from './ReadImagesJPEG3or4';
+import { ReadSWF } from './ReadSWF';
+import { CharacterTag, DefineBinaryDataTag, ImageTag, ITag, SymbolClassTag } from './tags';
export class HabboAssetSWF
{
- private readonly _tags: Array;
+ private readonly _tags: Array = [];
private _documentClass: string | null = null;
constructor(
- private readonly _data: string | Buffer
+ private readonly _data: Buffer
)
- {
- this._tags = new Array();
- }
+ {}
- async setupAsync()
+ public async setupAsync()
{
- const swf = await readSwfAsync(this._data);
+ const swf = await ReadSWF(this._data);
if(!swf) return;
for(const tag of swf.tags)
{
-
switch(tag.header.code)
{
case 76:
@@ -35,67 +30,29 @@ export class HabboAssetSWF
case 87:
this._tags.push(new DefineBinaryDataTag(tag.data));
break;
-
case 6:
console.log(tag);
break;
-
case 21: {
- const jpeg3 = await readImagesJPEG3or4(21, tag);
- this._tags.push(new ImageTag({
- code: 21,
- characterID: jpeg3.characterId,
- imgType: 'jpeg',
- imgData: jpeg3.imageData,
- bitmapWidth: jpeg3.bitmapWidth,
- bitmapHeight: jpeg3.bitmapHeight
- }));
+ const jpeg3 = await ReadImagesJPEG3or4(21, tag);
+ this._tags.push(new ImageTag(jpeg3.characterId, 21, 'jpeg', jpeg3.imgData));
break;
}
-
case 35: {
- const jpeg3 = await readImagesJPEG3or4(35, tag);
- this._tags.push(new ImageTag({
- code: jpeg3.code,
- characterID: jpeg3.characterId,
- imgType: jpeg3.imgType,
- imgData: jpeg3.imgData,
- bitmapWidth: jpeg3.bitmapWidth,
- bitmapHeight: jpeg3.bitmapHeight
- }));
+ const jpeg3 = await ReadImagesJPEG3or4(35, tag);
+ this._tags.push(new ImageTag(jpeg3.characterId, jpeg3.code, jpeg3.imgType, jpeg3.imgData));
break;
}
-
case 36: {
- const pngTagLossLess2: any = await readImagesDefineBitsLossless(tag);
- this._tags.push(new ImageTag({
- code: pngTagLossLess2.code,
- characterID: pngTagLossLess2.characterId,
- imgType: pngTagLossLess2.imgType,
- imgData: pngTagLossLess2.imgData,
- bitmapWidth: pngTagLossLess2.bitmapWidth,
- bitmapHeight: pngTagLossLess2.bitmapHeight
- }));
+ const pngTagLossLess2: any = await ReadImagesDefineBitsLossless(tag);
+ this._tags.push(new ImageTag(pngTagLossLess2.characterId, pngTagLossLess2.code, pngTagLossLess2.imgType, pngTagLossLess2.imgData, pngTagLossLess2.bitmapWidth, pngTagLossLess2.bitmapHeight));
break;
}
-
case 20: {
- const pngTagLossless: any = await readImagesDefineBitsLossless(tag);
- this._tags.push(new ImageTag({
- code: pngTagLossless.code,
- characterID: pngTagLossless.characterId,
- imgType: pngTagLossless.imgType,
- imgData: pngTagLossless.imgData,
- bitmapWidth: pngTagLossless.bitmapWidth,
- bitmapHeight: pngTagLossless.bitmapHeight
- }));
+ const pngTagLossless: any = await ReadImagesDefineBitsLossless(tag);
+ this._tags.push(new ImageTag(pngTagLossless.characterId, pngTagLossless.code, pngTagLossless.imgType, pngTagLossless.imgData, pngTagLossless.bitmapWidth, pngTagLossless.bitmapHeight));
break;
}
-
- case 90:
- console.log(tag);
- break;
-
default:
//console.log(tag.header.code);
break;
@@ -172,8 +129,7 @@ export class HabboAssetSWF
public getBinaryTagByName(name: string): DefineBinaryDataTag | null
{
- const streamTag = this.binaryTags()
- .filter(tag => tag.className === name)[0];
+ const streamTag = this.binaryTags().filter(tag => tag.className === name)[0];
if(streamTag === undefined) return null;
diff --git a/src/swf/PackImages.ts b/src/swf/PackImages.ts
new file mode 100644
index 0000000..6458e08
--- /dev/null
+++ b/src/swf/PackImages.ts
@@ -0,0 +1,43 @@
+import { packAsync } from 'free-tex-packer-core';
+import { ImageBundle, SpriteBundle } from '../common';
+
+export const PackImages = async (documentClass: string, imageBundle: ImageBundle, convertCase: boolean = false) =>
+{
+ const files = await packAsync(imageBundle.images, {
+ textureName: (convertCase ? documentClass.substring(1) : documentClass),
+ width: 10240,
+ height: 4320,
+ fixedSize: false,
+ allowRotation: false,
+ detectIdentical: true,
+ allowTrim: true,
+ //@ts-ignore
+ exporter: 'Pixi'
+ });
+
+ const bundle = new SpriteBundle();
+
+ for(const item of files)
+ {
+ if(item.name.endsWith('.json'))
+ {
+ bundle.spritesheet = JSON.parse(item.buffer.toString('utf8'));
+
+ delete bundle.spritesheet.meta.app;
+ delete bundle.spritesheet.meta.version;
+ }
+ else
+ {
+ bundle.imageData = {
+ name: item.name,
+ buffer: item.buffer
+ };
+
+ if(convertCase) bundle.imageData.name = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1);
+ }
+ }
+
+ if((bundle.spritesheet !== undefined) && (bundle.imageData !== undefined)) bundle.spritesheet.meta.image = bundle.imageData.name;
+
+ return bundle;
+};
diff --git a/src/swf/ReadImagesDefineBitsLossless.ts b/src/swf/ReadImagesDefineBitsLossless.ts
new file mode 100644
index 0000000..698671b
--- /dev/null
+++ b/src/swf/ReadImagesDefineBitsLossless.ts
@@ -0,0 +1,89 @@
+import encoder from 'png-stream/encoder';
+import streamToArray from 'stream-to-array';
+import { promisify } from 'util';
+import { unzip } from 'zlib';
+import { ISWFTag } from './common';
+
+export const ReadImagesDefineBitsLossless = async (tag: Partial) =>
+{
+ const { characterId, bitmapFormat, bitmapWidth, bitmapHeight, bitmapColorTableSize, zlibBitmapData } = tag;
+
+ const pngEncoder = new encoder(bitmapWidth, bitmapHeight, { colorSpace: 'rgba' });
+ const dataBuf = await promisify(unzip)(zlibBitmapData);
+
+ if(!dataBuf) return null;
+ const output = Buffer.alloc(bitmapWidth * bitmapHeight * 4);
+
+ let index = 0;
+ let ptr = 0;
+
+ switch(bitmapFormat)
+ {
+ case 5: {
+ for(let y = 0; y < bitmapHeight; ++y)
+ {
+ for(let x = 0; x < bitmapWidth; ++x)
+ {
+ const alpha = dataBuf[ptr];
+ output[index] = dataBuf[ptr + 1] * (255 / alpha);
+ output[index + 1] = dataBuf[ptr + 2] * (255 / alpha);
+ output[index + 2] = dataBuf[ptr + 3] * (255 / alpha);
+ output[index + 3] = alpha;
+ index += 4;
+ ptr += 4;
+ }
+ }
+
+ break;
+ }
+ case 3: {
+ // 8-bit colormapped image
+ const colorMap = [];
+
+ for(let i = 0; i < bitmapColorTableSize + 1; ++i)
+ {
+ colorMap.push([dataBuf[ptr], dataBuf[ptr + 1], dataBuf[ptr + 2], dataBuf[ptr + 3]]);
+
+ ptr += 4;
+ }
+
+ for(let _y2 = 0; _y2 < bitmapHeight; ++_y2)
+ {
+ for(let _x2 = 0; _x2 < bitmapWidth; ++_x2)
+ {
+ const idx = dataBuf[ptr];
+ const color = idx < colorMap.length ? colorMap[idx] : [0, 0, 0, 0];
+ output[index] = color[0];
+ output[index + 1] = color[1];
+ output[index + 2] = color[2];
+ output[index + 3] = color[3];
+ ptr += 1;
+ index += 4;
+ }
+
+ // skip padding
+ ptr += (4 - bitmapWidth % 4) % 4;
+ }
+
+ break;
+ }
+ default:
+ // reject(new Error('unhandled bitmapFormat: ' + bitmapFormat));
+ break;
+ }
+
+ pngEncoder.end(output);
+
+ const parts = await streamToArray(pngEncoder);
+
+ const buffers = parts.map(part => Buffer.isBuffer(part) ? part : Buffer.from(part));
+
+ return {
+ code: 36,
+ characterId: characterId,
+ imgType: 'png',
+ imgData: Buffer.concat(buffers),
+ bitmapWidth: bitmapWidth,
+ bitmapHeight: bitmapHeight
+ };
+};
diff --git a/src/swf/ReadImagesJPEG3or4.ts b/src/swf/ReadImagesJPEG3or4.ts
new file mode 100644
index 0000000..70e804e
--- /dev/null
+++ b/src/swf/ReadImagesJPEG3or4.ts
@@ -0,0 +1,77 @@
+import * as concatFrames from 'concat-frames';
+import decoder from 'jpg-stream/decoder';
+import encoder from 'png-stream/encoder';
+import { PassThrough } from 'stream';
+import streamToArray from 'stream-to-array';
+import { promisify } from 'util';
+import { unzip } from 'zlib';
+import { SlicedToArray } from '../common';
+import { ISWFTag } from './common';
+import { RecognizeImageHeader } from './RecognizeImageHeader';
+
+export const ReadImagesJPEG3or4 = async (code: number, tag: Partial) =>
+{
+ const { characterId, imgData, bitmapAlphaData } = tag;
+ const imgType = RecognizeImageHeader(imgData);
+
+ if(imgType !== 'jpeg') return { code, characterId, imgType, imgData };
+
+ const pngEncoder = new encoder(undefined, undefined, { colorSpace: 'rgba' });
+ const alphaBufPre = await promisify(unzip)(bitmapAlphaData);
+
+ let alphaBuffer: Buffer = null;
+
+ if(alphaBufPre.length > 0) alphaBuffer = alphaBufPre;
+
+ const bufferStream = new PassThrough();
+
+ bufferStream.end(imgData);
+
+ bufferStream
+ .pipe(new decoder())
+ .pipe(concatFrames.default((data: any) =>
+ {
+ const _ref2 = SlicedToArray.slicedToArray(data, 1);
+ const frame = _ref2[0];
+
+ const input = frame.pixels;
+ const pCount = frame.width * frame.height;
+ const output = Buffer.alloc(pCount * 4);
+
+ if(alphaBuffer !== null && alphaBuffer.length !== pCount)
+ {
+ console.error('expect alphaBuf to have size ' + pCount + ' while getting ' + alphaBuffer.length);
+ }
+
+ const getAlphaBuffer = (i: any) =>
+ {
+ if(!alphaBuffer) return 0xFF;
+
+ return alphaBuffer[i];
+ };
+
+ for(let i = 0; i < pCount; ++i)
+ {
+ output[4 * i] = input[3 * i];
+ output[4 * i + 1] = input[3 * i + 1];
+ output[4 * i + 2] = input[3 * i + 2];
+ output[4 * i + 3] = getAlphaBuffer(i);
+ }
+
+ pngEncoder.format.width = frame.width;
+ pngEncoder.format.height = frame.height;
+ pngEncoder.end(output);
+ }));
+
+ const parts = await streamToArray(pngEncoder);
+ const buffers = parts.map(part => Buffer.isBuffer(part) ? part : Buffer.from(part));
+
+ bufferStream.end();
+
+ return {
+ code: code,
+ characterId: characterId,
+ imgType: 'png',
+ imgData: Buffer.concat(buffers)
+ };
+};
diff --git a/src/swf/ReadSWF.ts b/src/swf/ReadSWF.ts
new file mode 100644
index 0000000..9082020
--- /dev/null
+++ b/src/swf/ReadSWF.ts
@@ -0,0 +1,13 @@
+import { readFile } from 'fs/promises';
+import { UncompressSWF } from './UncompressSWF';
+
+export const ReadSWF = async (buffer: Buffer) =>
+{
+ if(Buffer.isBuffer(buffer)) return await UncompressSWF(buffer);
+
+ buffer = await readFile(buffer);
+
+ if(!buffer) return null;
+
+ return await UncompressSWF(buffer);
+};
diff --git a/src/swf/ReadSWFBuffer.ts b/src/swf/ReadSWFBuffer.ts
new file mode 100644
index 0000000..25a2176
--- /dev/null
+++ b/src/swf/ReadSWFBuffer.ts
@@ -0,0 +1,32 @@
+import { ISWF } from './common';
+import { readSWFTags } from './ReadSWFTags';
+import { SWFBuffer } from './SWFBuffer';
+
+export const ReadSWFBuff = (swfBuffer: SWFBuffer, rawBuffer: Buffer) =>
+{
+ if(!swfBuffer || !rawBuffer) return null;
+
+ swfBuffer.seek(3);
+
+ if(swfBuffer.length < 9)
+ {
+ console.error('Buffer is to small, must be greater than 9 bytes.');
+
+ return null;
+ }
+
+ const swf: ISWF = {
+ version: swfBuffer.readUInt8(),
+ fileLength: {
+ compressed: rawBuffer.length,
+ uncompressed: swfBuffer.readUIntLE(32)
+ },
+ frameSize: swfBuffer.readRect(),
+ frameRate: (swfBuffer.readUIntLE(16) / 256),
+ frameCount: swfBuffer.readUIntLE(16),
+ };
+
+ swf.tags = readSWFTags(swfBuffer, swf);
+
+ return swf;
+};
diff --git a/src/swf/ReadSWFTags.ts b/src/swf/ReadSWFTags.ts
new file mode 100644
index 0000000..4cb4505
--- /dev/null
+++ b/src/swf/ReadSWFTags.ts
@@ -0,0 +1,203 @@
+import { ISWF, ISWFFileAttributes, ISWFTag, ISWFTagHeader } from './common';
+import { SWFBuffer } from './SWFBuffer';
+import { SWFTags } from './SWFTags';
+
+export const readSWFTags = (buffer: SWFBuffer, swf: Partial) =>
+{
+ const tags: Partial[] = [];
+
+ let header: ISWFTagHeader = null;
+
+ while((header = buffer.readTagCodeAndLength()))
+ {
+ const tag: Partial = { header };
+
+ switch(header.code)
+ {
+ case SWFTags.FileAttributes: {
+ const flag = buffer.readUIntLE(32);
+ const fileAttrs: Partial = {};
+
+ fileAttrs.useNetwork = tag.useNetwork = !!(flag & 0x1);
+ fileAttrs.as3 = tag.as3 = !!(flag & 0x8);
+ fileAttrs.hasMetaData = tag.hasMetaData = !!(flag & 0x10);
+ fileAttrs.useGPU = tag.useGPU = !!(flag & 0x20);
+ fileAttrs.useDirectBit = tag.useDirectBit = !!(flag & 0x40);
+
+ swf.fileAttributes = fileAttrs;
+ break;
+ }
+ case SWFTags.Metadata:
+ swf.metadata = tag.metadata = buffer.readString();
+ break;
+ case SWFTags.SetBackgroundColor:
+ tag.RGB = buffer.readRGB();
+ swf.backgroundColor = ('#' + ((tag.RGB[0] * 65536) + (tag.RGB[1] * 256) + tag.RGB[0]).toString(16));
+ break;
+ case SWFTags.Protect:
+ swf.protect = header.length && buffer.readString();
+ break;
+ case SWFTags.DefineSceneAndFrameLabelData: {
+ let sc = tag.sceneCount = buffer.readEncodedU32();
+ tag.scenes = [];
+
+ while(sc--) tag.scenes.push({
+ offset: buffer.readEncodedU32(),
+ name: buffer.readString()
+ });
+
+ let fc = tag.frameLabelCount = buffer.readEncodedU32();
+ tag.labels = [];
+
+ while(fc--) tag.labels.push({
+ frameNum: buffer.readEncodedU32(),
+ frameLabel: buffer.readString()
+ });
+ break;
+ }
+ case SWFTags.FrameLabel: {
+ tag.name = buffer.readString();
+ const l = Buffer.byteLength(tag.name);
+ if(l && ((header.length - 1) !== l)) tag.anchor = buffer.readUInt8();
+ break;
+ }
+ case SWFTags.DefineSprite:
+ tag.SpriteID = buffer.readUIntLE(16);
+ tag.FrameCount = buffer.readUIntLE(16);
+ tag.ControlTags = readSWFTags(buffer, swf);
+ break;
+ case SWFTags.ExportAssets: {
+ tag.count = buffer.readUIntLE(16);
+ tag.assets = [];
+
+ let l = 0;
+
+ while(l++ < tag.count) tag.assets.push({
+ id: buffer.readUIntLE(16),
+ name: buffer.readString()
+ });
+ break;
+ }
+ case SWFTags.ImportAssets: {
+ tag.url = buffer.readString();
+ tag.count = buffer.readUIntLE(16);
+ tag.assets = [];
+
+ let l = 0;
+
+ while(l++ < tag.count) tag.assets.push({
+ id: buffer.readUIntLE(16),
+ name: buffer.readString()
+ });
+ break;
+ }
+ case SWFTags.ImportAssets2: {
+ tag.url = buffer.readString();
+
+ if(!((1 === buffer.readUInt8()) && (0 === buffer.readUInt8()))) throw new Error('Reserved bits for ImportAssets2 used');
+
+ tag.count = buffer.readUIntLE(16);
+ tag.assets = [];
+
+ let l = 0;
+
+ while(l++ < tag.count) tag.assets.push({
+ id: buffer.readUIntLE(16),
+ name: buffer.readString()
+ });
+ break;
+ }
+ case SWFTags.EnableDebugger:
+ tag.password = buffer.readString();
+ break;
+ case SWFTags.EnableDebugger2:
+ tag.password = buffer.readString();
+ break;
+ case SWFTags.ScriptLimits:
+ tag.maxRecursionDepth = buffer.readUIntLE(16);
+ tag.scriptTimeoutSeconds = buffer.readUIntLE(16);
+ break;
+ case SWFTags.SymbolClass: {
+ tag.numSymbols = buffer.readUIntLE(16);
+ tag.symbols = [];
+
+ let l = 0;
+
+ while(l++ < tag.numSymbols) tag.symbols.push({
+ id: buffer.readUIntLE(16),
+ name: buffer.readString()
+ });
+ break;
+ }
+ case SWFTags.DefineScalingGrid:
+ tag.characterId = buffer.readUIntLE(16);
+ tag.splitter = buffer.readRect();
+ break;
+ case SWFTags.SetTabIndex:
+ tag.depth = buffer.readUIntLE(16);
+ tag.tabIndex = buffer.readUIntLE(16);
+ break;
+ case SWFTags.JPEGTables:
+ tag.jpegData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length);
+ buffer.pointer += header.length;
+ break;
+ case SWFTags.DefineBits:
+ tag.characterId = buffer.readUIntLE(16);
+ tag.jpegData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length - 2);
+ buffer.pointer += (header.length - 2);
+ break;
+ case SWFTags.DefineBitsJPEG2:
+ tag.characterId = buffer.readUIntLE(16);
+ tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length - 2);
+ buffer.pointer += (header.length - 2);
+ break;
+ case SWFTags.DefineBitsJPEG3: {
+ tag.characterId = buffer.readUIntLE(16);
+ const alphaDataOffset = buffer.readUIntLE(32);
+ tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + alphaDataOffset);
+ buffer.pointer += alphaDataOffset;
+ const restLength = ((header.length - 6) - alphaDataOffset);
+ tag.bitmapAlphaData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength);
+ buffer.pointer += restLength;
+ break;
+ }
+ case SWFTags.DefineBitsJPEG4: {
+ tag.characterId = buffer.readUIntLE(16);
+ const alphaDataOffset = buffer.readUIntLE(32);
+ tag.deblockParam = buffer.readUIntLE(16);
+ tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + alphaDataOffset);
+ buffer.pointer += alphaDataOffset;
+ const restLength = ((header.length - 8) - alphaDataOffset);
+ tag.bitmapAlphaData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength);
+ buffer.pointer += restLength;
+ break;
+ }
+ case SWFTags.DefineBitsLossless:
+ case SWFTags.DefineBitsLossless2: {
+ tag.characterId = buffer.readUIntLE(16);
+ tag.bitmapFormat = buffer.readUInt8();
+ tag.bitmapWidth = buffer.readUIntLE(16);
+ tag.bitmapHeight = buffer.readUIntLE(16);
+ let restLength = (header.length - 7);
+
+ if(tag.bitmapFormat === 3)
+ {
+ tag.bitmapColorTableSize = buffer.readUInt8();
+ restLength--;
+ }
+
+ tag.zlibBitmapData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength);
+ buffer.pointer += restLength;
+ break;
+ }
+ default:
+ tag.data = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length);
+ buffer.pointer += header.length;
+ break;
+ }
+
+ tags.push(tag);
+ }
+
+ return tags;
+};
diff --git a/src/swf/RecognizeImageHeader.ts b/src/swf/RecognizeImageHeader.ts
new file mode 100644
index 0000000..be94dc9
--- /dev/null
+++ b/src/swf/RecognizeImageHeader.ts
@@ -0,0 +1,14 @@
+const pngMagic = Buffer.from('0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A'.split(' ').map(Number));
+const gifMagic = Buffer.from('0x47 0x49 0x46 0x38 0x39 0x61'.split(' ').map(Number));
+const jpegMagic = Buffer.from('0xFF 0xD8'.split(' ').map(Number));
+
+export const RecognizeImageHeader = (buffer: Buffer) =>
+{
+ if(pngMagic.equals(buffer.slice(0, pngMagic.length))) return 'png';
+ if(gifMagic.equals(buffer.slice(0, gifMagic.length))) return 'gif';
+ if(jpegMagic.equals(buffer.slice(0, jpegMagic.length))) return 'jpeg';
+
+ console.error('Unknown format:', buffer.slice(0, 8));
+
+ return null;
+};
diff --git a/src/swf-reader/lib/SWFBuffer.ts b/src/swf/SWFBuffer.ts
similarity index 78%
rename from src/swf-reader/lib/SWFBuffer.ts
rename to src/swf/SWFBuffer.ts
index bbc9012..56751ba 100644
--- a/src/swf-reader/lib/SWFBuffer.ts
+++ b/src/swf/SWFBuffer.ts
@@ -4,7 +4,7 @@ export class SWFBuffer
public static EOS: number = 0x00;
public static STYLE_COUNT_EXT: number = 0xFF;
- public buffer: Buffer
+ public buffer: Buffer = null;
public pointer: number = 0;
public position: number = 1;
public current: number = 0;
@@ -12,10 +12,7 @@ export class SWFBuffer
constructor(buffer: Buffer)
{
- if(!Buffer.isBuffer(buffer))
- {
- throw new Error('invalid_buffer');
- }
+ if(!Buffer.isBuffer(buffer)) throw new Error('invalid_buffer');
this.buffer = buffer;
this.length = buffer.length;
@@ -35,7 +32,7 @@ export class SWFBuffer
break;
}
- this.pointer += bits / 8;
+ this.pointer += (bits / 8);
return value;
}
@@ -69,13 +66,13 @@ export class SWFBuffer
return [ ...this.readRGB(), this.readUInt8() ];
}
- public readString(encoding: BufferEncoding): string
+ public readString(encoding: BufferEncoding = 'utf8'): string
{
const init = this.pointer;
while(this.readUInt8() !== SWFBuffer.EOS);
- return this.buffer.toString(encoding || 'utf8', init, this.pointer - 1);
+ return this.buffer.toString((encoding || 'utf8'), init, (this.pointer - 1));
}
public readStyleArray(buffer: SWFBuffer, next)
@@ -122,7 +119,7 @@ export class SWFBuffer
public readLineStyle(buffer: SWFBuffer): { width: number, color: [ number, number, number, number ]}
{
return {
- width: buffer.readUIntLE(16)/20,
+ width: (buffer.readUIntLE(16) / 20),
color: buffer.readRGBA()
};
}
@@ -149,10 +146,10 @@ export class SWFBuffer
public readShapeWithStyle()
{
return {
- fillStyles : this.readStyleArray(this, this.readFillStyle),
- lineStyles : this.readStyleArray(this, this.readLineStyle),
- numFillBits : this.readBits(4),
- numLineBits : this.readBits(4),
+ fillStyles: this.readStyleArray(this, this.readFillStyle),
+ lineStyles: this.readStyleArray(this, this.readLineStyle),
+ numFillBits: this.readBits(4),
+ numLineBits: this.readBits(4),
shapeRecords: this.readShapeRecords(this)
};
}
@@ -162,8 +159,8 @@ export class SWFBuffer
if(this.pointer === this.length) return null;
const n = this.readUIntLE(16);
- const tagType = n >> 6;
- let tagLength = n & SWFBuffer.RECORDHEADER_LENTH_FULL;
+ const tagType = (n >> 6);
+ let tagLength = (n & SWFBuffer.RECORDHEADER_LENTH_FULL);
if(n === 0) return null;
@@ -177,22 +174,22 @@ export class SWFBuffer
this.start();
const NBits = this.readBits(5);
- const Xmin = this.readBits(NBits, true) / 20;
- const Xmax = this.readBits(NBits, true) / 20;
- const Ymin = this.readBits(NBits, true) / 20;
- const Ymax = this.readBits(NBits, true) / 20;
+ const Xmin = (this.readBits(NBits, true) / 20);
+ const Xmax = (this.readBits(NBits, true) / 20);
+ const Ymin = (this.readBits(NBits, true) / 20);
+ const Ymax = (this.readBits(NBits, true) / 20);
return {
- x : Xmin,
- y : Ymin,
- width : (Xmax > Xmin ? Xmax - Xmin : Xmin - Xmax),
- height : (Ymax > Ymin ? Ymax - Ymin : Ymin - Ymax)
+ x: Xmin,
+ y: Ymin,
+ width: (Xmax > Xmin ? (Xmax - Xmin) : (Xmin - Xmax)),
+ height: (Ymax > Ymin ? (Ymax - Ymin) : (Ymin - Ymax))
};
}
public seek(pos: number): void
{
- this.pointer = pos % this.buffer.length;
+ this.pointer = (pos % this.buffer.length);
}
public start(): void
@@ -217,9 +214,9 @@ export class SWFBuffer
{
if( this.position > 8 ) this.start();
- r = (r << 1 ) + ((this.current >> (8 - this.position++)) & 1);
+ r = (r << 1) + ((this.current >> (8 - this.position++)) & 1);
}
- return sign * r;
+ return (sign * r);
}
}
diff --git a/src/swf/SWFDownloader.ts b/src/swf/SWFDownloader.ts
new file mode 100644
index 0000000..d0a680f
--- /dev/null
+++ b/src/swf/SWFDownloader.ts
@@ -0,0 +1,39 @@
+import { FileUtilities } from '../common';
+import { HabboAssetSWF } from './HabboAssetSWF';
+
+export class SWFDownloader
+{
+ public static USES_REVISION: boolean = true;
+ public static LOG_DOWNLOADS: boolean = true;
+
+ public static getDownloadUrl(baseUrl: string, className: string, revision: string): string
+ {
+ let url = baseUrl;
+
+ if(!url || !url.length) return null;
+
+ if(SWFDownloader.USES_REVISION && (revision !== '-1')) url = url.replace('%revision%', revision.toString());
+
+ url = url.replace('%className%', className);
+
+ return url;
+ }
+
+ public static async downloadFromUrl(url: string): Promise
+ {
+ return await this.extractSWF(url);
+ }
+
+ public static async extractSWF(url: string): Promise
+ {
+ const buffer = await FileUtilities.readFileAsBuffer(url);
+
+ if(!buffer) return null;
+
+ const habboAssetSWF = new HabboAssetSWF(buffer);
+
+ await habboAssetSWF.setupAsync();
+
+ return habboAssetSWF;
+ }
+}
diff --git a/src/swf/SWFTags.ts b/src/swf/SWFTags.ts
new file mode 100644
index 0000000..1f0d2c7
--- /dev/null
+++ b/src/swf/SWFTags.ts
@@ -0,0 +1,68 @@
+export class SWFTags
+{
+ public static End: number = 0;
+ public static ShowFrame: number = 1;
+ public static DefineShape: number = 2;
+ public static PlaceObject: number = 4;
+ public static RemoveObject: number = 5;
+ public static DefineBits: number = 6;
+ public static DefineButton: number = 7;
+ public static JPEGTables: number = 8;
+ public static SetBackgroundColor: number = 9;
+ public static DefineFont: number = 10;
+ public static DefineText: number = 11;
+ public static DoAction: number = 12;
+ public static DefineFontInfo: number = 13;
+ public static DefineSound: number = 14;
+ public static StartSound: number = 15;
+ public static DefineButtonSound: number = 17;
+ public static SoundStreamHead: number = 18;
+ public static SoundStreamBlock: number = 19;
+ public static DefineBitsLossless: number = 20;
+ public static DefineBitsJPEG2: number = 21;
+ public static DefineShape2: number = 22;
+ public static DefineButtonCxform: number = 23;
+ public static Protect: number = 24;
+ public static PlaceObject2: number = 26;
+ public static RemoveObject2: number = 28;
+ public static DefineShape3: number = 32;
+ public static DefineText2: number = 33;
+ public static DefineButton2: number = 34;
+ public static DefineBitsJPEG3: number = 35;
+ public static DefineBitsLossless2: number = 36;
+ public static DefineEditText: number = 37;
+ public static DefineSprite: number = 39;
+ public static SerialNumber: number = 41;
+ public static FrameLabel: number = 43;
+ public static SoundStreamHead2: number = 45;
+ public static DefineMorphShape: number = 46;
+ public static DefineFont2: number = 48;
+ public static ExportAssets: number = 56;
+ public static ImportAssets: number = 57;
+ public static EnableDebugger: number = 58;
+ public static DoInitAction: number = 59;
+ public static DefineVideoStream: number = 60;
+ public static VideoFrame: number = 61;
+ public static DefineFontInfo2: number = 62;
+ public static EnableDebugger2: number = 64;
+ public static ScriptLimits: number = 65;
+ public static SetTabIndex: number = 66;
+ public static FileAttributes: number = 69;
+ public static PlaceObject3: number = 70;
+ public static ImportAssets2: number = 71;
+ public static DefineFontAlignZones: number = 73;
+ public static CSMTextSettings: number = 74;
+ public static DefineFont3: number = 75;
+ public static SymbolClass: number = 76;
+ public static Metadata: number = 77;
+ public static DefineScalingGrid: number = 78;
+ public static DoABC: number = 82;
+ public static DefineShape4: number = 83;
+ public static DefineMorphShape2: number = 84;
+ public static DefineSceneAndFrameLabelData: number = 86;
+ public static DefineBinaryData: number = 87;
+ public static DefineFontName: number = 88;
+ public static StartSound2: number = 89;
+ public static DefineBitsJPEG4: number = 90;
+ public static DefineFont4: number = 91;
+}
diff --git a/src/common/converters/SWFConverter.ts b/src/swf/SWFUtilities.ts
similarity index 85%
rename from src/common/converters/SWFConverter.ts
rename to src/swf/SWFUtilities.ts
index e3d20aa..e90e72a 100644
--- a/src/common/converters/SWFConverter.ts
+++ b/src/swf/SWFUtilities.ts
@@ -1,14 +1,10 @@
import { wrap } from 'bytebuffer';
import { parseStringPromise } from 'xml2js';
-import { IAssetData } from '../../mapping/json';
-import { AnimationMapper, AssetMapper, IndexMapper, LogicMapper, ManifestMapper, VisualizationMapper } from '../../mapping/mappers';
-import { HabboAssetSWF } from '../../swf/HabboAssetSWF';
-import { DefineBinaryDataTag } from '../../swf/tags/DefineBinaryDataTag';
-import { NitroBundle } from '../../utils/NitroBundle';
-import { SpriteBundle } from '../bundle/SpriteBundle';
-import { Converter } from './Converter';
+import { AnimationMapper, AssetMapper, IAssetData, IndexMapper, LogicMapper, ManifestMapper, NitroBundle, SpriteBundle, VisualizationMapper } from '../common';
+import { HabboAssetSWF } from './HabboAssetSWF';
+import { DefineBinaryDataTag } from './tags';
-export class SWFConverter extends Converter
+export class SWFUtilities
{
private static removeComments(data: string): string
{
@@ -44,7 +40,7 @@ export class SWFConverter extends Converter
public static async getManifestXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise
{
- const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'manifest', false, snakeCase);
+ const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'manifest', false, snakeCase);
if(!binaryData) return null;
@@ -53,7 +49,7 @@ export class SWFConverter extends Converter
public static async getIndexXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise
{
- const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'index', false, snakeCase);
+ const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'index', false, snakeCase);
if(!binaryData) return null;
@@ -62,7 +58,7 @@ export class SWFConverter extends Converter
public static async getAssetsXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise
{
- const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'assets', true, snakeCase);
+ const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'assets', true, snakeCase);
if(!binaryData) return null;
@@ -71,7 +67,7 @@ export class SWFConverter extends Converter
public static async getLogicXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise
{
- const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'logic', true, snakeCase);
+ const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'logic', true, snakeCase);
if(!binaryData) return null;
@@ -80,7 +76,7 @@ export class SWFConverter extends Converter
public static async getVisualizationXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise
{
- const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'visualization', true, snakeCase);
+ const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'visualization', true, snakeCase);
if(!binaryData) return null;
@@ -89,7 +85,7 @@ export class SWFConverter extends Converter
public static async getAnimationXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise
{
- const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'animation', false, snakeCase);
+ const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'animation', false, snakeCase);
if(!binaryData) return null;
@@ -98,7 +94,7 @@ export class SWFConverter extends Converter
public static getPalette(habboAssetSWF: HabboAssetSWF, paletteName: string): [ number, number, number ][]
{
- const binaryData = SWFConverter.getBinaryData(habboAssetSWF, paletteName, false);
+ const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, paletteName, false);
if(!binaryData || !binaryData.binaryDataBuffer) return null;
@@ -138,7 +134,7 @@ export class SWFConverter extends Converter
const output: IAssetData = {};
- output.type = assetType;
+ if(assetType) output.type = assetType;
const indexXML = await this.getIndexXML(habboAssetSWF, snakeCase);
diff --git a/src/swf/UncompressSWF.ts b/src/swf/UncompressSWF.ts
new file mode 100644
index 0000000..0b7ba3e
--- /dev/null
+++ b/src/swf/UncompressSWF.ts
@@ -0,0 +1,86 @@
+import * as lzma from 'lzma-purejs';
+import { Stream } from 'stream';
+import { promisify } from 'util';
+import { unzip } from 'zlib';
+import { ReadSWFBuff } from './ReadSWFBuffer';
+import { SWFBuffer } from './SWFBuffer';
+
+export const UncompressSWF = async (rawBuffer: Buffer) =>
+{
+ if(!Buffer.isBuffer(rawBuffer)) return null;
+
+ let compressedBuffer = rawBuffer.slice(8);
+
+ switch(rawBuffer[0])
+ {
+ case 0x43: { // zlib compressed
+ const buffer = await (promisify(unzip)(compressedBuffer));
+
+ if(!Buffer.isBuffer(buffer)) return null;
+
+ return ReadSWFBuff(new SWFBuffer(buffer), rawBuffer);
+ }
+ case 0x46: // uncompressed
+ return ReadSWFBuff(new SWFBuffer(rawBuffer), rawBuffer);
+ case 0x5a: { // LZMA compressed
+ const lzmaProperties = compressedBuffer.slice(4, 9);
+ compressedBuffer = compressedBuffer.slice(9);
+
+ const inputStream = new Stream();
+
+ let inputPos = 0;
+
+ //@ts-ignore
+ inputStream.readByte = () =>
+ {
+ return inputPos >= compressedBuffer.length ? -1 : compressedBuffer[inputPos++];
+ };
+
+ const outputStream = new Stream();
+
+ let outputBuffer = Buffer.alloc(16384);
+ let outputPos = 0;
+
+ //@ts-ignore
+ outputStream.writeByte = (_byte: number) =>
+ {
+ if(outputPos >= outputBuffer.length)
+ {
+ const newBuffer = Buffer.alloc(outputBuffer.length * 2);
+
+ outputBuffer.copy(newBuffer);
+ outputBuffer = newBuffer;
+ }
+
+ outputBuffer[outputPos++] = _byte;
+
+ return true;
+ };
+
+ //@ts-ignore
+ outputStream.getBuffer = () =>
+ {
+ // trim buffer
+ if(outputPos !== outputBuffer.length)
+ {
+ const newBuffer = Buffer.alloc(outputPos);
+ outputBuffer.copy(newBuffer, 0, 0, outputPos);
+ outputBuffer = newBuffer;
+ }
+
+ return outputBuffer;
+ };
+
+ lzma.decompress(lzmaProperties, inputStream, outputStream, -1);
+
+ //@ts-ignore
+ const buffer = Buffer.concat([ rawBuffer.slice(0, 8), outputStream.getBuffer() ]);
+
+ if(!Buffer.isBuffer(buffer)) return null;
+
+ return ReadSWFBuff(new SWFBuffer(buffer), rawBuffer);
+ }
+ }
+
+ return null;
+};
diff --git a/src/swf/common/ISWF.ts b/src/swf/common/ISWF.ts
new file mode 100644
index 0000000..ed97c88
--- /dev/null
+++ b/src/swf/common/ISWF.ts
@@ -0,0 +1,18 @@
+import { ISWFFileAttributes } from './ISWFFileAttributes';
+import { ISWFFileLength } from './ISWFFileLength';
+import { ISWFFrameSize } from './ISWFFrameSize';
+import { ISWFTag } from './ISWFTag';
+
+export interface ISWF
+{
+ version?: number;
+ fileLength?: ISWFFileLength;
+ frameSize?: ISWFFrameSize;
+ frameRate?: number;
+ frameCount?: number;
+ backgroundColor?: string;
+ fileAttributes?: Partial;
+ metadata?: string;
+ protect?: string;
+ tags?: Partial[];
+}
diff --git a/src/swf/common/ISWFFileAttributes.ts b/src/swf/common/ISWFFileAttributes.ts
new file mode 100644
index 0000000..3a396f3
--- /dev/null
+++ b/src/swf/common/ISWFFileAttributes.ts
@@ -0,0 +1,8 @@
+export interface ISWFFileAttributes
+{
+ useNetwork: boolean,
+ as3: boolean,
+ hasMetaData: boolean,
+ useGPU: boolean,
+ useDirectBit: boolean
+}
diff --git a/src/swf/common/ISWFFileLength.ts b/src/swf/common/ISWFFileLength.ts
new file mode 100644
index 0000000..ac51b9f
--- /dev/null
+++ b/src/swf/common/ISWFFileLength.ts
@@ -0,0 +1,5 @@
+export interface ISWFFileLength
+{
+ compressed: number;
+ uncompressed: number;
+}
diff --git a/src/swf/common/ISWFFrameSize.ts b/src/swf/common/ISWFFrameSize.ts
new file mode 100644
index 0000000..ad43e52
--- /dev/null
+++ b/src/swf/common/ISWFFrameSize.ts
@@ -0,0 +1,7 @@
+export interface ISWFFrameSize
+{
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+}
diff --git a/src/swf/common/ISWFTag.ts b/src/swf/common/ISWFTag.ts
new file mode 100644
index 0000000..b7ff7ef
--- /dev/null
+++ b/src/swf/common/ISWFTag.ts
@@ -0,0 +1,49 @@
+import { ISWFTagAsset } from './ISWFTagAsset';
+import { ISWFTagHeader } from './ISWFTagHeader';
+import { ISWFTagLabel } from './ISWFTagLabel';
+import { ISWFTagScene } from './ISWFTagScene';
+import { ISWFTagSplitter } from './ISWFTagSplitter';
+import { ISWFTagSymbol } from './ISWFTagSymbol';
+
+export interface ISWFTag
+{
+ header: ISWFTagHeader;
+ useNetwork: boolean;
+ as3: boolean;
+ hasMetaData: boolean;
+ useGPU: boolean;
+ useDirectBit: boolean;
+ metadata: string;
+ RGB: [ number, number, number ];
+ sceneCount: number;
+ scenes: ISWFTagScene[];
+ frameLabelCount: number;
+ labels: ISWFTagLabel[];
+ name: string;
+ anchor: number;
+ SpriteID: number;
+ FrameCount: number;
+ ControlTags: Partial[];
+ count: number;
+ assets: ISWFTagAsset[];
+ url: string;
+ characterId: number;
+ bitmapFormat: number;
+ bitmapWidth: number;
+ bitmapHeight: number;
+ bitmapColorTableSize: number;
+ zlibBitmapData: Buffer;
+ deblockParam: number;
+ imgData: Buffer;
+ bitmapAlphaData: Buffer;
+ jpegData: Buffer;
+ data: Buffer;
+ splitter: ISWFTagSplitter;
+ depth: number;
+ tabIndex: number;
+ password: string;
+ maxRecursionDepth: number;
+ scriptTimeoutSeconds: number;
+ numSymbols: number;
+ symbols: ISWFTagSymbol[];
+}
diff --git a/src/swf/common/ISWFTagAsset.ts b/src/swf/common/ISWFTagAsset.ts
new file mode 100644
index 0000000..de5be06
--- /dev/null
+++ b/src/swf/common/ISWFTagAsset.ts
@@ -0,0 +1,5 @@
+export interface ISWFTagAsset
+{
+ id: number;
+ name: string;
+}
diff --git a/src/swf/common/ISWFTagHeader.ts b/src/swf/common/ISWFTagHeader.ts
new file mode 100644
index 0000000..ba6d6b5
--- /dev/null
+++ b/src/swf/common/ISWFTagHeader.ts
@@ -0,0 +1,5 @@
+export interface ISWFTagHeader
+{
+ code: number;
+ length: number;
+}
diff --git a/src/swf/common/ISWFTagLabel.ts b/src/swf/common/ISWFTagLabel.ts
new file mode 100644
index 0000000..5b2f2e7
--- /dev/null
+++ b/src/swf/common/ISWFTagLabel.ts
@@ -0,0 +1,5 @@
+export interface ISWFTagLabel
+{
+ frameNum: number;
+ frameLabel: string;
+}
diff --git a/src/swf/common/ISWFTagScene.ts b/src/swf/common/ISWFTagScene.ts
new file mode 100644
index 0000000..1fa49f3
--- /dev/null
+++ b/src/swf/common/ISWFTagScene.ts
@@ -0,0 +1,5 @@
+export interface ISWFTagScene
+{
+ offset: number;
+ name: string;
+}
diff --git a/src/swf/common/ISWFTagSplitter.ts b/src/swf/common/ISWFTagSplitter.ts
new file mode 100644
index 0000000..03f30f3
--- /dev/null
+++ b/src/swf/common/ISWFTagSplitter.ts
@@ -0,0 +1,7 @@
+export interface ISWFTagSplitter
+{
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+}
diff --git a/src/swf/common/ISWFTagSymbol.ts b/src/swf/common/ISWFTagSymbol.ts
new file mode 100644
index 0000000..72f7a1d
--- /dev/null
+++ b/src/swf/common/ISWFTagSymbol.ts
@@ -0,0 +1,5 @@
+export interface ISWFTagSymbol
+{
+ id: number;
+ name: string;
+}
diff --git a/src/swf/common/index.ts b/src/swf/common/index.ts
new file mode 100644
index 0000000..c61164d
--- /dev/null
+++ b/src/swf/common/index.ts
@@ -0,0 +1,11 @@
+export * from './ISWF';
+export * from './ISWFFileAttributes';
+export * from './ISWFFileLength';
+export * from './ISWFFrameSize';
+export * from './ISWFTag';
+export * from './ISWFTagAsset';
+export * from './ISWFTagHeader';
+export * from './ISWFTagLabel';
+export * from './ISWFTagScene';
+export * from './ISWFTagSplitter';
+export * from './ISWFTagSymbol';
diff --git a/src/swf/index.ts b/src/swf/index.ts
new file mode 100644
index 0000000..da1aa20
--- /dev/null
+++ b/src/swf/index.ts
@@ -0,0 +1,18 @@
+export * from './common';
+export * from './ConcatSWFHeader';
+export * from './GenerateNitroBundleFromSwf';
+export * from './GenerateSpritesheet';
+export * from './HabboAssetSWF';
+export * from './PackImages';
+export * from './ReadImagesDefineBitsLossless';
+export * from './ReadImagesJPEG3or4';
+export * from './ReadSWF';
+export * from './ReadSWFBuffer';
+export * from './ReadSWFTags';
+export * from './RecognizeImageHeader';
+export * from './SWFBuffer';
+export * from './SWFDownloader';
+export * from './SWFTags';
+export * from './SWFUtilities';
+export * from './tags';
+export * from './UncompressSWF';
diff --git a/src/swf/tags/CharacterTag.ts b/src/swf/tags/CharacterTag.ts
index 2f44f53..3f8d35d 100644
--- a/src/swf/tags/CharacterTag.ts
+++ b/src/swf/tags/CharacterTag.ts
@@ -1,7 +1,11 @@
export abstract class CharacterTag
{
private _className: string = '';
- private _characterId: number = -1;
+
+ constructor(
+ protected _characterId: number = 1
+ )
+ {}
public get className(): string
{
diff --git a/src/swf/tags/ImageTag.ts b/src/swf/tags/ImageTag.ts
index 422cec1..b8e09b1 100644
--- a/src/swf/tags/ImageTag.ts
+++ b/src/swf/tags/ImageTag.ts
@@ -3,27 +3,16 @@ import { ITag } from './ITag';
export class ImageTag extends CharacterTag implements ITag
{
- private readonly _code: number;
- private readonly _characterID: number;
- private readonly _imgType: string;
- private readonly _imgData: Buffer;
-
- private readonly _bitmapWidth: number;
- private readonly _bitmapHeight: number;
-
- constructor(image: { code: number, characterID: number, imgType: string, imgData: Buffer, bitmapWidth: number, bitmapHeight: number })
+ constructor(
+ protected _characterId: number,
+ private _code: number,
+ private _imgType: string,
+ private _imgData: Buffer,
+ private _imgWidth: number = 0,
+ private _imgHeight: number = 0
+ )
{
- super();
-
- this._code = image.code;
- this._characterID = image.characterID;
- this._imgType = image.imgType;
- this._imgData = image.imgData;
-
- this.characterId = this._characterID;
-
- this._bitmapWidth = image.bitmapWidth;
- this._bitmapHeight = image.bitmapHeight;
+ super(_characterId);
}
public get code(): number
@@ -31,11 +20,6 @@ export class ImageTag extends CharacterTag implements ITag
return this._code;
}
- public get characterID(): number
- {
- return this._characterID;
- }
-
public get imgType(): string
{
return this._imgType;
@@ -46,13 +30,13 @@ export class ImageTag extends CharacterTag implements ITag
return this._imgData;
}
- public get bitmapWidth(): number
+ public get imgWidth(): number
{
- return this._bitmapWidth;
+ return this._imgWidth;
}
- public get bitmapHeight(): number
+ public get imgHeight(): number
{
- return this._bitmapHeight;
+ return this._imgHeight;
}
}
diff --git a/src/swf/tags/index.ts b/src/swf/tags/index.ts
new file mode 100644
index 0000000..9cb05c1
--- /dev/null
+++ b/src/swf/tags/index.ts
@@ -0,0 +1,6 @@
+export * from './CharacterTag';
+export * from './DefineBinaryDataTag';
+export * from './ImageTag';
+export * from './ISymbolClass';
+export * from './ITag';
+export * from './SymbolClassTag';
diff --git a/src/utils/File.ts b/src/utils/File.ts
deleted file mode 100644
index 5ff7c3a..0000000
--- a/src/utils/File.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { existsSync, lstatSync, mkdirSync, readdirSync, RmOptions, rmSync } from 'fs';
-
-export class File
-{
- private readonly _path: string;
-
- constructor(path: string)
- {
- this._path = path;
- }
-
- public exists(): boolean
- {
- return existsSync(this._path);
- }
-
- public mkdirs(): void
- {
- return mkdirSync(this._path);
- }
-
- public list(): string[]
- {
- const test = readdirSync(this._path);
-
- return test;
- }
-
- public isDirectory(): boolean
- {
- return this.exists() && lstatSync(this._path).isDirectory();
- }
-
- public rmdir(options: RmOptions): void
- {
- return rmSync(this._path, options);
- }
-
- public get path(): string
- {
- return this._path;
- }
-}
diff --git a/src/utils/Logger.ts b/src/utils/Logger.ts
deleted file mode 100644
index b185fe3..0000000
--- a/src/utils/Logger.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { WriteStream } from 'fs';
-import { singleton } from 'tsyringe';
-
-@singleton()
-export class Logger
-{
- private _fileName: string = `error-${ Date.now() }.log`;
- private _writeStream: WriteStream = null;
-
- constructor()
- {
-
- }
-
- public logError(message: string): void
- {
- //
- }
-}
diff --git a/src/utils/NitroBundle.ts b/src/utils/NitroBundle.ts
deleted file mode 100644
index a81c84d..0000000
--- a/src/utils/NitroBundle.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import * as ByteBuffer from 'bytebuffer';
-import { promisify } from 'util';
-import * as zlib from 'zlib';
-
-const gzip = promisify(zlib.gzip);
-
-export class NitroBundle
-{
- private readonly _files: Map;
-
- constructor()
- {
- this._files = new Map();
- }
-
- addFile(name: string, data: Buffer)
- {
- this._files.set(name, data);
- }
-
- async toBufferAsync()
- {
- const buffer = new ByteBuffer();
-
- buffer.writeUint16(this._files.size);
-
- const iterator = this._files.entries();
- let result: IteratorResult<[string, Buffer]> = iterator.next();
- while(!result.done)
- {
- const fileName = result.value[0];
- const file = result.value[1];
-
- buffer.writeUint16(fileName.length);
- buffer.writeString(fileName);
-
- const compressed = await gzip(file);
- buffer.writeUint32(compressed.length);
- buffer.append(compressed);
-
- result = iterator.next();
- }
-
- return buffer.flip().toBuffer();
- }
-}
diff --git a/src/utils/SwfReader.ts b/src/utils/SwfReader.ts
deleted file mode 100644
index 9c1d795..0000000
--- a/src/utils/SwfReader.ts
+++ /dev/null
@@ -1,311 +0,0 @@
-import {writeFileSync} from "fs";
-
-const SWFReader = require('../swf-reader/index.js');
-
-const _encoder = require('png-stream/encoder');
-
-const _encoder2 = _interopRequireDefault(_encoder);
-
-const _zlib = require('zlib');
-
-const _zlib2 = _interopRequireDefault(_zlib);
-
-const _streamToArray = require('stream-to-array');
-
-const _streamToArray2 = _interopRequireDefault(_streamToArray);
-
-const _stream = require('stream');
-
-const _stream2 = _interopRequireDefault(_stream);
-
-const _decoder = require('jpg-stream/decoder');
-
-const _decoder2 = _interopRequireDefault(_decoder);
-
-function _interopRequireDefault(obj: any)
-{
- return obj && obj.__esModule ? obj : { default: obj };
-}
-
-const _concatFrames = require('concat-frames');
-
-const _concatFrames2 = _interopRequireDefault(_concatFrames);
-
-const _slicedToArray = function ()
-{
- function sliceIterator(arr: any, i: any)
- {
- const _arr = [];
- let _n = true;
- let _d = false;
- let _e = undefined;
- try
- {
- for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true)
- {
- _arr.push(_s.value);
- if(i && _arr.length === i) break;
- }
- }
- catch (err)
- {
- _d = true;
- _e = err;
- }
- finally
- {
- try
- {
- if(!_n && _i['return']) _i['return']();
- }
- finally
- {
- if(_d) throw _e;
- }
- }
- return _arr;
- }
-
- return function (arr: any, i: any)
- {
- if(Array.isArray(arr))
- {
- return arr;
- }
- else if(Symbol.iterator in Object(arr))
- {
- return sliceIterator(arr, i);
- }
- else
- {
- throw new TypeError('Invalid attempt to destructure non-iterable instance');
- }
- };
-}();
-
-export function readSwfAsync(data: string | Buffer): Promise
-{
- return new Promise(((resolve, reject) =>
- {
- SWFReader.read(data, function (err: Error, swf: any)
- {
- if(err)
- {
- reject(err);
- }
- resolve(swf);
- });
- }));
-}
-
-const pngMagic = Buffer.from('0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A'.split(' ').map(Number));
-const gifMagic = Buffer.from('0x47 0x49 0x46 0x38 0x39 0x61'.split(' ').map(Number));
-const jpegMagic = Buffer.from('0xFF 0xD8'.split(' ').map(Number));
-const recognizeHeader = function recognizeHeader(buffer: Buffer)
-{
- if(pngMagic.equals(buffer.slice(0, pngMagic.length))) return 'png';
- if(gifMagic.equals(buffer.slice(0, gifMagic.length))) return 'gif';
- if(jpegMagic.equals(buffer.slice(0, jpegMagic.length))) return 'jpeg';
-
- throw new Error('unknown format: ' + buffer.slice(0, 8));
-};
-
-export async function readImagesJPEG3or4(code: number, tagData: any): Promise
-{
- const characterId = tagData.characterId,
- imageData = tagData.imageData;
-
- const imgType = recognizeHeader(imageData);
- if(imgType !== 'jpeg')
- {
- return {
- code: code,
- characterId: characterId,
- imgType: imgType,
- imgData: imageData
- };
- }
-
- const bitmapAlphaData = tagData.bitmapAlphaData;
-
- return new Promise(function (resolve, reject)
- {
- const enc = new _encoder2.default(undefined, undefined, { colorSpace: 'rgba' });
- _zlib2.default.unzip(bitmapAlphaData, function (err: any, alphaBufPre: any)
- {
- // INVARIANT: alphaBuf is either null or a non-empty buffer
- let alphaBuf: any = null;
- if(err)
- {
- /*
- Due to a bug present in node zlib (https://github.com/nodejs/node/issues/17041)
- unzipping an empty buffer can raise "unexpected end of file" error.
- We fix this here so that our impl does not depend on the version of node
- being used.
- Theoretically every zlib.unzip call needs to be guarded, but for this package,
- other two zlib.unzip call happens at sites that an empty uncompressed Buffer
- does not make sense. So I think the current fix is good enough.
- */
- if(bitmapAlphaData && bitmapAlphaData.length > 0)
- {
- return reject(new Error(err));
- }
- // leaving alphaBuf as null
- }
- else
- {
- // ensure alphaBuf is only assigned an non-empty Buffer
- if(alphaBufPre.length > 0) alphaBuf = alphaBufPre;
- }
- const bufferStream = new _stream2.default.PassThrough();
- bufferStream.end(imageData);
- bufferStream.pipe(new _decoder2.default()).pipe((_concatFrames2.default)(function (_ref: any)
- {
- const _ref2 = _slicedToArray(_ref, 1),
- frame = _ref2[0];
-
- const input = frame.pixels;
- const pCount = frame.width * frame.height;
- const output = Buffer.alloc(pCount * 4);
- if(alphaBuf !== null && alphaBuf.length !== pCount)
- {
- console.error('expect alphaBuf to have size ' + pCount + ' while getting ' + alphaBuf.length);
- }
- const getAlphaBuf = alphaBuf === null ? function (_ignored: any)
- {
- return 0xff;
- } : function (i: any)
- {
- return alphaBuf[i];
- };
-
- for(let i = 0; i < pCount; ++i)
- {
- output[4 * i] = input[3 * i];
- output[4 * i + 1] = input[3 * i + 1];
- output[4 * i + 2] = input[3 * i + 2];
- output[4 * i + 3] = getAlphaBuf(i);
- }
- enc.format.width = frame.width;
- enc.format.height = frame.height;
- enc.end(output);
- }));
- });
- (_streamToArray2.default)(enc).then(function (parts: any)
- {
- const buffers = parts.map(function (part: any)
- {
- return Buffer.isBuffer(part) ? part : Buffer.from(part);
- });
- resolve({
- code: code,
- characterId: characterId,
- imgType: 'png',
- imgData: Buffer.concat(buffers)
- });
- });
- });
-}
-
-export interface ImageTagData {
- code: number,
- characterId: number,
- imgType: string,
- imgData: Buffer,
- bitmapWidth: number,
- bitmapHeight: number
-}
-
-export function readImagesDefineBitsLossless(tag: any)
-{
- const characterId = tag.characterId,
- bitmapFormat = tag.bitmapFormat,
- bitmapWidth = tag.bitmapWidth,
- bitmapHeight = tag.bitmapHeight,
- bitmapColorTableSize = tag.bitmapColorTableSize,
- zlibBitmapData = tag.zlibBitmapData;
-
-
- return new Promise(function (resolve, reject)
- {
- const enc = new _encoder2.default(bitmapWidth, bitmapHeight, { colorSpace: 'rgba' });
-
- _zlib2.default.unzip(zlibBitmapData, function (err: any, dataBuf: any)
- {
- if(err)
- {
- return reject(new Error(err));
- }
- const output = Buffer.alloc(bitmapWidth * bitmapHeight * 4);
- let index = 0;
- let ptr = 0;
- if(bitmapFormat === 5)
- {
- // 32-bit ARGB image
- for(let y = 0; y < bitmapHeight; ++y)
- {
- for(let x = 0; x < bitmapWidth; ++x)
- {
- const alpha = dataBuf[ptr];
- output[index] = dataBuf[ptr + 1] * (255 / alpha);
- output[index + 1] = dataBuf[ptr + 2] * (255 / alpha);
- output[index + 2] = dataBuf[ptr + 3] * (255 / alpha);
- output[index + 3] = alpha;
- index += 4;
- ptr += 4;
- }
- }
- }
- else if(bitmapFormat === 3)
- {
- // 8-bit colormapped image
- const colorMap = [];
- for(let i = 0; i < bitmapColorTableSize + 1; ++i)
- {
- colorMap.push([dataBuf[ptr], dataBuf[ptr + 1], dataBuf[ptr + 2], dataBuf[ptr + 3]]);
- ptr += 4;
- }
- for(let _y2 = 0; _y2 < bitmapHeight; ++_y2)
- {
- for(let _x2 = 0; _x2 < bitmapWidth; ++_x2)
- {
- const idx = dataBuf[ptr];
- const color = idx < colorMap.length ? colorMap[idx] : [0, 0, 0, 0];
- output[index] = color[0];
- output[index + 1] = color[1];
- output[index + 2] = color[2];
- output[index + 3] = color[3];
- ptr += 1;
- index += 4;
- }
- // skip padding
- ptr += (4 - bitmapWidth % 4) % 4;
- }
- }
- else
- {
- return reject(new Error('unhandled bitmapFormat: ' + bitmapFormat));
- }
- enc.end(output);
- });
-
- (_streamToArray2.default)(enc).then(function (parts: any)
- {
- const buffers = parts.map(function (part: any)
- {
- return Buffer.isBuffer(part) ? part : Buffer.from(part);
- });
- resolve({
- code: 36,
- characterId: characterId,
- imgType: 'png',
- imgData: Buffer.concat(buffers),
- bitmapWidth: bitmapWidth,
- bitmapHeight: bitmapHeight
- });
- });
- }).catch(function (e)
- {
- console.error(e);
- });
-}
diff --git a/tsconfig.json b/tsconfig.json
index 5373a57..41b76b2 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
"module": "commonjs",
- "declaration": true,
+ "declaration": false,
"noImplicitAny": false,
"noUnusedLocals": false,
"removeComments": true,
@@ -12,12 +12,13 @@
"target": "es6",
"sourceMap": false,
"allowJs": true,
+ "esModuleInterop": true,
"baseUrl": "./src",
"outDir": "./dist"
},
"include": [
- "src/configuration.json",
- "src/**/*"
+ "src/**/*",
+ "node_modules/wrappy/swf"
],
"exclude": [
"node_modules",
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..112e7cf
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,2120 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
+ integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
+"@babel/helper-validator-identifier@^7.15.7":
+ version "7.15.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
+ integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
+
+"@babel/highlight@^7.10.4":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a"
+ integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.15.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@eslint/eslintrc@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
+ integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.1.1"
+ espree "^7.3.0"
+ globals "^13.9.0"
+ ignore "^4.0.6"
+ import-fresh "^3.2.1"
+ js-yaml "^3.13.1"
+ minimatch "^3.0.4"
+ strip-json-comments "^3.1.1"
+
+"@humanwhocodes/config-array@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
+ integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.0"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.0":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@jvitela/mustache-wax@^1.0.1":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@jvitela/mustache-wax/-/mustache-wax-1.0.4.tgz#18c54e8dc9793e01515674beadf80bd1dfb1dd29"
+ integrity sha512-cGugVYp0WO7w89KQlyyt2rQyCO5MbrKeqtIAkG8oBfOaiHoeGeKG7WYdBFHftvoZUuK4WFbWyn3hgFipdetC+Q==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@types/bytebuffer@^5.0.42":
+ version "5.0.42"
+ resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.42.tgz#1c602a77942d34c5c0879ad75c58d5d8c07dfb3b"
+ integrity sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==
+ dependencies:
+ "@types/long" "*"
+ "@types/node" "*"
+
+"@types/json-schema@^7.0.7":
+ version "7.0.9"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
+ integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+
+"@types/long@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
+ integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
+
+"@types/node-fetch@^2.5.8":
+ version "2.5.12"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66"
+ integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "17.0.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.3.tgz#4b086e316ed4504f49bd78135d48642bf50aa135"
+ integrity sha512-bAKB1GcA28FR/D8HHQ5U4FYk7nvoZdp7TZSy9oIyQ8gpYCzpeESa3LCK2TbeocXic7GwIXCkCItJg0DttO3ZaQ==
+
+"@types/node@^14.14.28":
+ version "14.18.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.2.tgz#00fe4d1686d5f6cf3a2f2e9a0eef42594d06abfc"
+ integrity sha512-fqtSN5xn/bBzDxMT77C1rJg6CsH/R49E7qsGuvdPJa20HtV5zSTuLJPNfnlyVH3wauKnkHdLggTVkOW/xP9oQg==
+
+"@types/pako@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/pako/-/pako-1.0.2.tgz#17c9b136877f33d9ecc8e73cd26944f1f6dd39a1"
+ integrity sha512-8UJl2MjkqqS6ncpLZqRZ5LmGiFBkbYxocD4e4jmBqGvfRG1RS23gKsBQbdtV9O9GvRyjFTiRHRByjSlKCLlmZw==
+
+"@types/stream-to-array@^2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@types/stream-to-array/-/stream-to-array-2.3.0.tgz#d151f183748b52f2ec79f3b09696313912f1f753"
+ integrity sha512-s8Y6/EV1LPn9fDlJKSlD8r+14hWXVDn+wPAGwWRzTUq/4MqdoQNEzQxP6Jq91qvFYxR3OlFAPXcv6ToplnAgFQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/strip-bom@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2"
+ integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=
+
+"@types/strip-json-comments@0.0.30":
+ version "0.0.30"
+ resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
+ integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==
+
+"@types/xml2js@^0.4.8":
+ version "0.4.9"
+ resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.9.tgz#a38267d8c2fe121c96922b12ee3bd89a58a6e20e"
+ integrity sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==
+ dependencies:
+ "@types/node" "*"
+
+"@typescript-eslint/eslint-plugin@^4.15.1":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276"
+ integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "4.33.0"
+ "@typescript-eslint/scope-manager" "4.33.0"
+ debug "^4.3.1"
+ functional-red-black-tree "^1.0.1"
+ ignore "^5.1.8"
+ regexpp "^3.1.0"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/experimental-utils@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
+ integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
+ dependencies:
+ "@types/json-schema" "^7.0.7"
+ "@typescript-eslint/scope-manager" "4.33.0"
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/typescript-estree" "4.33.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/parser@^4.15.1":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899"
+ integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==
+ dependencies:
+ "@typescript-eslint/scope-manager" "4.33.0"
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/typescript-estree" "4.33.0"
+ debug "^4.3.1"
+
+"@typescript-eslint/scope-manager@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3"
+ integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==
+ dependencies:
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/visitor-keys" "4.33.0"
+
+"@typescript-eslint/types@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
+ integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==
+
+"@typescript-eslint/typescript-estree@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
+ integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==
+ dependencies:
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/visitor-keys" "4.33.0"
+ debug "^4.3.1"
+ globby "^11.0.3"
+ is-glob "^4.0.1"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/visitor-keys@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
+ integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==
+ dependencies:
+ "@typescript-eslint/types" "4.33.0"
+ eslint-visitor-keys "^2.0.0"
+
+acorn-jsx@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^7.4.0:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^8.0.1:
+ version "8.8.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb"
+ integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
+amdefine@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-0.1.1.tgz#b5c75c532052dccd6a39c0064c772c8d57a06cd2"
+ integrity sha1-tcdcUyBS3M1qOcAGTHcsjVegbNI=
+
+ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+any-promise@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+asn1@~0.2.3:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bignumber.js@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8"
+ integrity sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bl@^0.9.3:
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054"
+ integrity sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=
+ dependencies:
+ readable-stream "~1.0.26"
+
+bl@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
+bmp-js@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a"
+ integrity sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+buffer-crc32@^0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+
+buffer-equal@0.0.1, buffer-equal@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
+ integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bytebuffer@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd"
+ integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=
+ dependencies:
+ long "~3"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chalk@^2.0.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chokidar@^3.5.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+ 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"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-spinners@^2.5.0:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
+ integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928"
+ integrity sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=
+
+concat-frames@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/concat-frames/-/concat-frames-1.0.3.tgz#cfe9a816f25c7b75963d99fef2f4aa0458fbf99b"
+ integrity sha1-z+moFvJce3WWPZn+8vSqBFj7+Zs=
+ dependencies:
+ pixel-stream "^1.0.3"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+core-util-is@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@^4.0.1, debug@^4.1.1, debug@^4.3.1:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
+ integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+ dependencies:
+ ms "2.1.2"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dynamic-dedupe@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1"
+ integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=
+ dependencies:
+ xtend "^4.0.0"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+enquirer@^2.3.5:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+es6-promise@^3.0.2:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
+ integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+ integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint-visitor-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint@^7.20.0:
+ version "7.32.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
+ integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
+ dependencies:
+ "@babel/code-frame" "7.12.11"
+ "@eslint/eslintrc" "^0.4.3"
+ "@humanwhocodes/config-array" "^0.5.0"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.0.1"
+ doctrine "^3.0.0"
+ enquirer "^2.3.5"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^2.1.0"
+ eslint-visitor-keys "^2.0.0"
+ espree "^7.3.1"
+ esquery "^1.4.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ functional-red-black-tree "^1.0.1"
+ glob-parent "^5.1.2"
+ globals "^13.6.0"
+ ignore "^4.0.6"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ js-yaml "^3.13.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.0.4"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ progress "^2.0.0"
+ regexpp "^3.1.0"
+ semver "^7.2.1"
+ strip-ansi "^6.0.0"
+ strip-json-comments "^3.1.0"
+ table "^6.0.9"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@^7.3.0, espree@^7.3.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
+ integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
+ dependencies:
+ acorn "^7.4.0"
+ acorn-jsx "^5.3.1"
+ eslint-visitor-keys "^1.3.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+exif-parser@^0.1.9:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
+ integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
+
+exif-reader@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/exif-reader/-/exif-reader-1.0.3.tgz#8eb63f878aeb49ec89bd5b7be10e393db78c3c2e"
+ integrity sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+ integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.1.1:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
+ integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
+ 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"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastq@^1.6.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+ integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+ dependencies:
+ reusify "^1.0.4"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+file-type@^3.1.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+ integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2"
+ integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+free-tex-packer-core@^0.3.2:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/free-tex-packer-core/-/free-tex-packer-core-0.3.4.tgz#f6c28e5a6daa7297dd8259256821695cebd4a1de"
+ integrity sha512-GRitycJ2wbqf6Bzj6W3TyFFEcV2MTBSGUDBGfXORfCXtuljScp9E7dx79ZzvHdZv48MKWf+S7u9qk8E2NIQhIQ==
+ dependencies:
+ "@jvitela/mustache-wax" "^1.0.1"
+ jimp "^0.2.28"
+ maxrects-packer "^2.5.0"
+ mustache "^2.3.0"
+ tinify "^1.5.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@^7.1.3:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^13.6.0, globals@^13.9.0:
+ version "13.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e"
+ integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==
+ dependencies:
+ type-fest "^0.20.2"
+
+globby@^11.0.3:
+ version "11.0.4"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
+ integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.1.4, ignore@^5.1.8:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ip-regex@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
+ integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
+ integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
+ dependencies:
+ has "^1.0.3"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-interactive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
+ integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+jimp@^0.2.28:
+ version "0.2.28"
+ resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2"
+ integrity sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=
+ dependencies:
+ bignumber.js "^2.1.0"
+ bmp-js "0.0.3"
+ es6-promise "^3.0.2"
+ exif-parser "^0.1.9"
+ file-type "^3.1.0"
+ jpeg-js "^0.2.0"
+ load-bmfont "^1.2.3"
+ mime "^1.3.4"
+ mkdirp "0.5.1"
+ pixelmatch "^4.0.0"
+ pngjs "^3.0.0"
+ read-chunk "^1.0.1"
+ request "^2.65.0"
+ stream-to-buffer "^0.1.0"
+ tinycolor2 "^1.1.2"
+ url-regex "^3.0.0"
+
+jpeg-js@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482"
+ integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=
+
+jpg-stream@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/jpg-stream/-/jpg-stream-1.1.2.tgz#4dba159d9d19368df21318f648cee980a72be407"
+ integrity sha1-TboVnZ0ZNo3yExj2SM7pgKcr5Ac=
+ dependencies:
+ exif-reader "^1.0.0"
+ pixel-stream "^1.0.3"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-schema@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+jsprim@^1.2.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
+ integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.4.0"
+ verror "1.10.0"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+load-bmfont@^1.2.3:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9"
+ integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==
+ dependencies:
+ buffer-equal "0.0.1"
+ mime "^1.3.4"
+ parse-bmfont-ascii "^1.0.3"
+ parse-bmfont-binary "^1.0.5"
+ parse-bmfont-xml "^1.1.4"
+ phin "^2.9.1"
+ xhr "^2.0.1"
+ xtend "^4.0.0"
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.truncate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+ integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
+
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
+long@~3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
+ integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+lzma-purejs@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/lzma-purejs/-/lzma-purejs-0.9.3.tgz#c8917e894b1b4db5c865b927df864edde759ccde"
+ integrity sha1-yJF+iUsbTbXIZbkn34ZO3edZzN4=
+ dependencies:
+ amdefine "~0.1.0"
+ commander "~2.0.0"
+
+make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+maxrects-packer@^2.5.0:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/maxrects-packer/-/maxrects-packer-2.7.2.tgz#47405e62353af117bab24874896839ec4f4e48db"
+ integrity sha512-akd5IRLPqQeWlpJyRJyfYq86VB05zzbMIdyTgLxRk4z1H0A8g4oTJW31Yo6zO9piSRsFNYdzmgudW7J2g1gEhQ==
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+mime-db@1.51.0:
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ dependencies:
+ mime-db "1.51.0"
+
+mime@^1.3.4:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
+
+minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+mkdirp@0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+ dependencies:
+ minimist "0.0.8"
+
+mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+mustache@^2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5"
+ integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+node-fetch@^2.6.1:
+ version "2.6.6"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89"
+ integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ 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"
+
+ora@^5.3.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
+ integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
+ dependencies:
+ bl "^4.1.0"
+ chalk "^4.1.0"
+ cli-cursor "^3.1.0"
+ cli-spinners "^2.5.0"
+ is-interactive "^1.0.0"
+ is-unicode-supported "^0.1.0"
+ log-symbols "^4.1.0"
+ strip-ansi "^6.0.0"
+ wcwidth "^1.0.1"
+
+pako@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d"
+ integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-bmfont-ascii@^1.0.3:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
+ integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
+
+parse-bmfont-binary@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
+ integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
+
+parse-bmfont-xml@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
+ integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
+ dependencies:
+ xml-parse-from-string "^1.0.0"
+ xml2js "^0.4.5"
+
+parse-headers@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.4.tgz#9eaf2d02bed2d1eff494331ce3df36d7924760bf"
+ integrity sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+phin@^2.9.1:
+ version "2.9.3"
+ resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
+ integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pixel-stream@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/pixel-stream/-/pixel-stream-1.0.3.tgz#53e8c54b21d5508393b53bcb32b64a7755f1fa5e"
+ integrity sha1-U+jFSyHVUIOTtTvLMrZKd1Xx+l4=
+ dependencies:
+ shallow-copy "0.0.1"
+
+pixelmatch@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
+ integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=
+ dependencies:
+ pngjs "^3.0.0"
+
+png-stream@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/png-stream/-/png-stream-1.0.5.tgz#5bc71687ea8959427e950e52c7cca49e2a6f04c6"
+ integrity sha1-W8cWh+qJWUJ+lQ5Sx8yknipvBMY=
+ dependencies:
+ bl "^0.9.3"
+ buffer-crc32 "^0.2.3"
+ buffer-equal "^0.0.1"
+ pixel-stream "^1.0.3"
+
+pngjs@^3.0.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
+ integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+"promise-nodeify@>= 0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/promise-nodeify/-/promise-nodeify-3.0.1.tgz#f0f5d9720ee9ec71dd2bfa92667be504c10229c2"
+ integrity sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg==
+
+"proxying-agent@>= 2.1":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/proxying-agent/-/proxying-agent-2.4.0.tgz#6796549fc46bf3423554440f64a4449220f9014d"
+ integrity sha512-b9vDqIcViJZVsWPpQlp9Py74u+Wqd0a+kMkkg7zX58mwNtrNbOChNlRTM7lUrlpiwNzyJCV8+5D8rnZYLDFh7Q==
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+read-chunk@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194"
+ integrity sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=
+
+readable-stream@^3.4.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~1.0.26:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+reflect-metadata@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+ integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
+regexpp@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+
+request@^2.65.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.0.0:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^2.6.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@>=0.6.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+semver@^7.2.1, semver@^7.3.5:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+ dependencies:
+ lru-cache "^6.0.0"
+
+shallow-copy@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
+ integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+signal-exit@^3.0.2:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
+ integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+source-map-support@^0.5.12, source-map-support@^0.5.17:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+stream-to-array@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353"
+ integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=
+ dependencies:
+ any-promise "^1.1.0"
+
+stream-to-buffer@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9"
+ integrity sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=
+ dependencies:
+ stream-to "~0.2.0"
+
+stream-to@~0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d"
+ integrity sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=
+
+string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-json-comments@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+table@^6.0.9:
+ version "6.7.5"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.7.5.tgz#f04478c351ef3d8c7904f0e8be90a1b62417d238"
+ integrity sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==
+ dependencies:
+ ajv "^8.0.1"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+tinify@^1.5.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/tinify/-/tinify-1.6.1.tgz#b27a032c447ebddd4231007489069a434ef72b5e"
+ integrity sha512-9XITdFE+p3+W/7HDgDEfxETbAh0vDdul33qo81P0Q+TNR8l6TALDb52MMhs7fWz7i4Pp3y1VdVYEy4EyiF4gUw==
+ dependencies:
+ promise-nodeify ">= 0.1"
+ proxying-agent ">= 2.1"
+
+tinycolor2@^1.1.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
+ integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+tree-kill@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+ integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
+ts-node-dev@^1.1.1:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.1.8.tgz#95520d8ab9d45fffa854d6668e2f8f9286241066"
+ integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg==
+ dependencies:
+ chokidar "^3.5.1"
+ dynamic-dedupe "^0.3.0"
+ minimist "^1.2.5"
+ 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 "^9.0.0"
+ tsconfig "^7.0.0"
+
+ts-node@^9.0.0, ts-node@^9.1.1:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d"
+ integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==
+ dependencies:
+ arg "^4.1.0"
+ create-require "^1.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ source-map-support "^0.5.17"
+ yn "3.1.1"
+
+tsconfig@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7"
+ integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==
+ 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"
+
+tslib@^1.8.1, tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+tsyringe@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.6.0.tgz#14915d3d7f0db35e1cf7269bdbf7c440713c8d07"
+ integrity sha512-BMQAZamSfEmIQzH8WJeRu1yZGQbPSDuI9g+yEiKZFIcO46GPZuMOC2d0b52cVBdw1d++06JnDSIIZvEnogMdAw==
+ dependencies:
+ tslib "^1.9.3"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+typescript@^4.1.5:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8"
+ integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+url-regex@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
+ integrity sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=
+ dependencies:
+ ip-regex "^1.0.1"
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+v8-compile-cache@^2.0.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
+ integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ dependencies:
+ defaults "^1.0.3"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+xhr@^2.0.1:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xml-parse-from-string@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
+ integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
+
+xml2js@^0.4.23, xml2js@^0.4.5:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
+ integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+xtend@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==