commit 48111c89c0df2ca29e8b19600d397afb5b2e6e3e Author: Verita84 Date: Wed Aug 25 08:44:55 2021 -0600 fix diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..531fc90 --- /dev/null +++ b/README.md @@ -0,0 +1,122 @@ +# PiCluster + +![Pic](https://git.rage.lol/verita84/picluster/raw/branch/master/images/piclusterLogo.png) + + PiCluster is a simple way to manage Docker containers on multiple hosts. I created this because I found Docker Swarm not that good and Kubernetes was too difficult to install currently on ARM. PiCluster will only build and run images from Dockerfile's on the host specified in the config file. This software will work on regular x86 hardware also and is not tied to ARM. + + + +[![Build Status](https://travis-ci.org/picluster/picluster.svg?branch=master)](https://travis-ci.org/picluster/picluster) [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0) + +![Pic](https://git.rage.lol/verita84/picluster/raw/branch/master/images/picluster-mainscreen.png) + +## Features + +- Move containers to different hosts in the cluster +- Container Load Balancer +- Run commands in parallel across Nodes +- Heartbeat for services +- Easily build and orchestrate Docker images across nodes +- Web interface +- CLI interface +- Monitor host metrics (Disk, CPU, Memory) +- HTTP interface +- Virtual Networking via Swarm +- Virtual IP Manager +- Rsyslog Analytics +- Built-in web terminal to easily run commands on nodes +- Integrate the Kibana dashboard into PiCluster +- Integrates with Elasticsearch to store the PiCluster logs and host monitoring metrics . +- Automatic container failover to different nodes +- Pull container images from a registry +- Upload Dockerfile archives to the entire cluster +- Functions-as-a-Service (FaaS) + +## Prerequisites + +- Docker +- Node.js +- OpenSSL +- pq +- git +- curl + +### Ubuntu +``` +apt-get install openssl git node docker pq curl +``` + +### Arch Linux +``` +pacman -S openssl git node docker pq curl +``` + +## Cloning this Repository + +``` +git clone https://git.rage.lol/verita84/picluster.git picluster +``` + +To clone the developer branch (not recommended unless you know what you're doing): + +``` +git clone -b dev https://git.rage.lol/verita84/picluster.git picluster +``` + +## Config file reference +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/Config-Reference) + +## Try PiCluster in Docker + +We included a compose file to evaluate PiCluster easily on your laptop. Simply Install Docker on your laptop and do the following: + +``` +cd picluster +docker-compose up -d +``` + +Finally, in your web browser go to + +## Installation +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/Installation) + +## Container Load Balancer +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/Container-Load-Balancer) + +## Upgrading + +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/Upgrading) + +## Functions-as-a-Service (FAAS) +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/Serverless-%28FaaS%29) +
+ +## Configuring and using the command-line client "pictl" + +[See Wiki](https://github.com/picluster/picluster/wiki/Pictl) + +## SSL/TLS + +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/SSL-Configuration) + +## Using pm2 to init PiCluster on systemd + +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/PM2) + +## Automatic Container failover to other hosts + +[See Wiki](https://git.rage.lol/verita84/picluster/wiki/Automatic-Container-failover-to-other-hosts) + +# Authors and Contributions + +* Project created by [Verita84](https://rage.lol/verita84). + +* [TokinRing](https://github.com/TokinRing), core developer. + +* [AidanHarris](https://github.com/aidanharris), core developer. + +* PiCluster Logos by chzbacon. + +## Images + +This work, "Raspy Whale", is a derivative of "raspberry" by Chanut is Industries from the Noun Project used under CC BY, "Sperm Whale" by Oksana Latysheva from the Noun Project used under CC BY, and "Sperm Whale" by Oksana Latysheva from the Noun Project used under CC BY. "Raspy Whale" is licensed under CC BY by Jordan Sinn. diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt new file mode 100644 index 0000000..39a367d --- /dev/null +++ b/RELEASE_NOTES.txt @@ -0,0 +1,23 @@ +# Version 3.0.11 + +## New Features: +* Manage Containers: Has a new option called "Commit Image" that allows you to update a Docker image with the current running image. +* Operations: Has a new option called "Edit Hosts" which will let you modify /etc/hosts on the server and then it will be copied to each node. + +## Enhancements: +* Added PiCluster version to /nodes API +* Webconsole: Displays version number from server +* Webconsole: Removed depcreciated BodyParser constructor +* Webconsole: Image list shows size and created time. +* ElasticSearch: Support for SSL/TLS + +## Removed or Deprecated: +* None + +## Bug Fixes: +* Docker Swarm fix for adding nodes to existing cluster +* Heatbeat - Was incorrectly sending restart requests to the Server instead of Agent +* Node List - Fix for displaying the Ubuntu Logo +* Docker-compose files functional, moved away from Alpine Linux +* Updated Github Link to git.rage.lol on blank.html +* Server no longer hangs when running a command when a node is offline diff --git a/agent/agent.js b/agent/agent.js new file mode 100644 index 0000000..76ca7e6 --- /dev/null +++ b/agent/agent.js @@ -0,0 +1,495 @@ +const http = require('http'); +const https = require('https'); +const fs = require('fs'); +const os = require('os'); +const unzip = require('unzip-stream'); +const express = require('express'); +const diskspace = require('diskspace'); +const bodyParser = require('body-parser'); +const multer = require('multer'); +const getos = require('getos'); +const sysinfo = require('systeminformation'); +const { + exec +} = require('child_process'); +const superagent = require('superagent'); +let config = process.env.PICLUSTER_CONFIG ? JSON.parse(fs.readFileSync(process.env.PICLUSTER_CONFIG, 'utf8')) : JSON.parse(fs.readFileSync('../config.json', 'utf8')); +const app = express(); + +if (config.ssl_self_signed) { + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; +} + +app.use(express.json({ + limit: '20mb' +})); + +const upload = multer({ + dest: '../' +}); + +const scheme = config.ssl ? 'https://' : 'http://'; +const ssl_self_signed = config.ssl_self_signed === false; +let server = config.web_connect; +let { + server_port +} = config; +const { + agent_port +} = config; +const node = os.hostname(); +let { + token +} = config; +const noop = () => {}; +let vip = ''; +let vip_slave = ''; +let ip_add_command = ''; +let ip_delete_command = ''; +let vip_ping_time = ''; +let cpu_percent = 0; +let os_type = ''; +let disk_percentage = 0; +let total_running_containers = 0; +let container_uptime = ''; +let network_rx = 0; +let network_tx = 0; +let running_containers = ''; +let container_mem_stats = ''; +let container_cpu_stats = ''; +let cpu_cores = 0; +let memory_buffers = 0; +let memory_swap = 0; +let memory_total = 0; +let memory_used = 0; +let memory_percentage = 0; +let images = ''; +let network_device = ''; + +sysinfo.networkInterfaces(data => { + network_device = data[1].iface; +}); + +function monitoring() { + + sysinfo.networkStats(network_device, data => { + network_tx = Math.round(data[0].tx_sec / 1000); + network_rx = Math.round(data[0].rx_sec / 1000); + }); + sysinfo.mem(data => { + memory_total = data.total; + memory_buffers = data.buffcache; + memory_used = data.used; + memory_swap = data.swapused; + const this_os = os.platform(); + + if (this_os.indexOf('linux') > -1) { + memory_percentage = Math.round((memory_used - memory_buffers) / memory_total * 100); + } else { + memory_percentage = Math.round((memory_swap + memory_buffers) / memory_total * 100); + } + }); + + exec('docker container ps -q', (err, stdout) => { + if (err) { + console.error(err); + } + total_running_containers = stdout.split('\n').length - 1; + }); + + exec('docker ps --format "{{.Names}}"', (err, stdout) => { + if (err) { + console.error(err); + } + running_containers = stdout.split('\n'); + }); + + exec('docker stats --no-stream --format "{{.CPUPerc}}"', (err, stdout) => { + if (err) { + console.error(err); + } + container_cpu_stats = stdout.replace(/%/gi, '').split('\n'); + }); + + exec('docker stats --no-stream --format "{{.MemPerc}}"', (err, stdout) => { + if (err) { + console.error(err); + } + container_mem_stats = stdout.replace(/%/gi, '').split('\n'); + }); + + exec('docker ps --format "{{.Status}}"', (err, stdout) => { + if (err) { + console.error(err); + } + container_uptime = stdout.split('\n'); + }); + + exec('docker images --format "table {{.Repository}}\t{{.CreatedSince}}\t{{.Size}}"', (err, stdout) => { + if (err) { + console.error(err); + } + images = stdout.split('\n'); + for (const i in images) { + if ((images[i].indexOf('REPOSITORY') > -1) || images[i].indexOf('') > -1) { + images[i] = ''; + } + } + images = images.filter((e, pos) => { + return e.length > 0 && images.indexOf(e) === pos; + }); + images = images.sort(); + }); + + setTimeout(() => { + getos((e, os) => { + os_type = (e) ? '' : os.dist || os.os; + }); + + diskspace.check('/', (err, result) => { + if (!err) { + disk_percentage = Math.round(result.used / result.total * 100); + } + }); + + require('cpu-stats')(1000, (error, result) => { + cpu_cores = 0; + let usage = 0; + result.forEach(e => { + usage += e.cpu; + cpu_cores++; + }); + cpu_percent = usage; + }); + monitoring(); + }, 3000); +} + +function send_ping() { + setTimeout(() => { + superagent + .post(`${scheme}${vip_slave}:${agent_port}/pong`) + .send({ + token: token + }) + .set('accept', 'json') + .end((err, res) => { + let found_vip = false; + if (err) { + const cmd = ip_add_command; + exec(cmd, (error, stdout, stderr) => {}, err => { + if (err) { + console.error('error:', err); + } + // Console.log('output', output); + }); + } else { + const interfaces = require('os').networkInterfaces(); + Object.keys(interfaces).forEach(devName => { + const iface = interfaces[devName]; + iface.forEach(alias => { + if (alias.address === vip) { + found_vip = true; + } + }); + }); + const json_object = JSON.parse(res.text); + + if (json_object.vip_detected === 'false' && found_vip === false) { + console.log('\nVIP not detected on either machine. Bringing up the VIP on this host.'); + const cmd = ip_add_command; + exec(cmd, (error, stdout, stderr) => {}, err => { + if (err) { + console.error('error:', err); + } + // Console.log('output', output); + }); + } + if ((json_object.vip_detected === 'true' && found_vip === true)) { + console.log('\nVIP detected on boths hosts! Stopping the VIP on this host.'); + const cmd = ip_delete_command; + exec(cmd, (error, stdout, stderr) => {}, err => { + if (err) { + console.error('error:', err); + } + // Console.log('output', output); + }); + } + } + }); + send_ping(); + }, vip_ping_time); +} + +app.get('/rsyslog', (req, res) => { + const check_token = req.query.token; + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + res.sendFile(config.rsyslog_logfile); + } +}); + +app.get('/node-status', (req, res) => { + const check_token = req.query.token; + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + const json_output = JSON.stringify({ + cpu_percent, + hostname: node, + os_type: (os_type === '') ? os.platform() : os_type, + disk_percentage, + total_running_containers, + running_containers, + container_mem_stats, + container_cpu_stats, + container_uptime, + network_rx, + network_tx, + images, + cpu_cores, + memory_percentage + }); + res.send(json_output); + } +}); + +app.post('/pong', (req, res) => { + const check_token = req.body.token; + if (check_token !== token) { + return res.status(500).send('Something broke!'); + } + + let vip_status = 'false'; + const interfaces = require('os').networkInterfaces(); + + Object.keys(interfaces).forEach(devName => { + const iface = interfaces[devName]; + iface.forEach(alias => { + if (alias.address === vip) { + vip_status = 'true'; + } + }); + }); + + const body = { + vip_detected: vip_status + }; + res.send(body); +}); + +function unzipFile(file) { + fs.createReadStream(file).pipe(new unzip.Extract({ + path: config.docker + })); +} + +function reloadConfig() { + try { + config = process.env.PICLUSTER_CONFIG ? JSON.parse(fs.readFileSync(process.env.PICLUSTER_CONFIG, 'utf8')) : JSON.parse(fs.readFileSync('../config.json', 'utf8')); + token = config.token; + server = config.web_connect; + server_port = config.server_port; + } catch (error) { + console.log(process.env.PICLUSTER_CONFIG); + console.log(error); + } +} + +app.post('/receive-file', upload.single('file'), (req, res) => { + const check_token = req.body.token; + const get_config_file = req.body.config_file; + let data = ''; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + let newPath = req.body.name; + let config_file = ''; + if (get_config_file) { + if (process.env.PICLUSTER_CONFIG) { + config_file = process.env.PICLUSTER_CONFIG; + } else { + config_file = '../config.json'; + } + newPath = config_file; + data = req.body.data; + } else if (req.body.name.indexOf('hosts') > -1) { + data = req.body.data; + newPath = req.body.name; + } else { + data = req.body.data.formData.file.data; + newPath = config.docker + '/' + req.body.name; + } + setTimeout(() => { + if (req.body.name.indexOf('hosts') > -1) { + fs.writeFile(newPath, data, err => { + if (err) { + console.log('Hosts Write Error:' + err); + } + }); + } else { + let buff = new Buffer.from(data, 'binary'); + fs.writeFile(newPath, buff, err => { + if (!err) { + if (newPath.indexOf('.zip') > -1) { + unzipFile(newPath); + fs.unlink(newPath, error => { + if (error) { + console.log(error); + } + }); + } + } + }); + } + }, 5000); + res.end('Done'); + } +}); + +app.post('/run', (req, res) => { + const output = { + output: "", + node + }; + + const check_token = req.body.token; + + if (check_token !== token) { + return res.status(401).json({ + output: 'Not Authorized to connect to this agent!' + }); + } + + exec(req.body.command, (error, stdout, stderr) => { + if (error) { + output.output = stderr; + } else { + output.output = stdout; + } + res.json(output); + }, err => { + if (err) { + console.error('error:', err); + } + // Console.log('output', output); + }); +}); + +if (config.ssl && config.ssl_cert && config.ssl_key) { + console.log('SSL Agent API enabled'); + const ssl_options = { + cert: fs.readFileSync(config.ssl_cert), + key: fs.readFileSync(config.ssl_key) + }; + const agent = https.createServer(ssl_options, app); + agent.listen(agent_port, () => { + console.log('Listening on port %d', agent_port); + }); +} else { + console.log('Non-SSL Agent API enabled'); + const agent = http.createServer(app); + agent.listen(agent_port, () => { + console.log('Listening on port %d', agent_port); + }); +} + +function bootstrapNode() { + setTimeout(() => { + console.log('Attempting to bootstrap node to server......'); + + try { + superagent + .post(`${scheme}${server}:${server_port}/bootstrap`) + .send({ + token: token, + host: node + }) + .set('accept', 'json') + .end((err, res) => { + if (err) { + console.log('Bootstrap failed due to an error or another bootstrap operation already in progress.\n'); + console.log(err); + bootstrapNode(); + } else { + try { + const status = JSON.parse(res.text); + if (status.output > 0) { + console.log('Bootstrap successful.'); + additional_services(); + } else { + console.log('\nAnother bootstrap is in progress. Will try again soon.....'); + bootstrapNode(); + } + } catch (error2) { + console.log('\n' + error2 + '\n' + JSON.stringify(res.text)); + bootstrapNode(); + } + } + }); + } catch (error) { + console.log('\nAn error has occurred with bootstrapping. Trying again.......' + '\n' + error); + bootstrapNode(); + } + }, 3000); +} + +bootstrapNode(); + +function additional_services() { + monitoring(); + + if (config.autostart_containers) { + console.log('Starting all the containers.....'); + + superagent + .get(`${scheme}${server}:${server_port}/start`) + .query({ + token: token, + container: '*' + }) + .end((err, res) => { + if (err) { + console.log(error); + } + }); + } + + if (config.vip_ip && config.vip) { + vip = config.vip_ip; + Object.keys(config.vip).forEach(i => { + const _node = config.vip[i].node; + Object.keys(config.vip[i]).forEach(key => { + if (!config.vip[i].hasOwnProperty(key)) { + return; + } + const interfaces = require('os').networkInterfaces(); + Object.keys(interfaces).forEach(devName => { + const iface = interfaces[devName]; + iface.forEach(alias => { + if (alias.address !== _node) { + return; + } + vip_slave = config.vip[i].slave; + const { + vip_eth_device + } = config.vip[i]; + ip_add_command = 'ip addr add ' + config.vip_ip + '/32 dev ' + vip_eth_device; + ip_delete_command = 'ip addr del ' + config.vip_ip + '/32 dev ' + vip_eth_device; + vip_ping_time = config.vip[i].vip_ping_time; + exec(ip_delete_command, (error, stdout, stderr) => { + send_ping(); + }, err => { + if (err) { + console.error('error:', err); + } + // Console.log('output', output); + }); + }); + }); + }); + }); + } +} \ No newline at end of file diff --git a/agent/package-lock.json b/agent/package-lock.json new file mode 100644 index 0000000..500a53c --- /dev/null +++ b/agent/package-lock.json @@ -0,0 +1,883 @@ +{ + "name": "picluster-agent", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "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==" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "child-process-promise": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", + "integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=", + "requires": { + "cross-spawn": "^4.0.2", + "node-version": "^1.0.0", + "promise-polyfill": "^6.0.1" + } + }, + "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" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "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=" + }, + "cpu-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cpu-stats/-/cpu-stats-1.0.0.tgz", + "integrity": "sha1-Mqkp1xk3nzXQ0+4MLS0T72zhX+8=" + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "diskspace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/diskspace/-/diskspace-2.0.0.tgz", + "integrity": "sha1-/eO4jVzV4V0Je7QuVQcz4liMyRM=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "fd-diskspace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fd-diskspace/-/fd-diskspace-1.0.0.tgz", + "integrity": "sha1-fru4oPQm3GHG2ruiE6IqTUIh9k8=" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "requires": { + "async": "^3.2.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "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=" + }, + "line-reader": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz", + "integrity": "sha1-F+RIGNoKwzVnW6MAlU+U72cOZv0=" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem-stat": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mem-stat/-/mem-stat-1.0.5.tgz", + "integrity": "sha1-fWbClxhNo4usv+T5zS6aeg4ZUIY=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "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.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "requires": { + "mime-db": "1.47.0" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-version": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", + "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "os": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", + "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "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" + } + }, + "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==" + }, + "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" + } + } + } + }, + "sys": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/sys/-/sys-0.0.1.tgz", + "integrity": "sha1-NIDMaVcUkFt6vOUKVaWjmFmX5hk=" + }, + "systeminformation": { + "version": "5.6.12", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.6.12.tgz", + "integrity": "sha512-prJAt+iS2ITeygjLt/FGtN1qsIQHrRePCUqWtP0hGv6JsS0LSQTR+y5hWAd4frUIM/sjG95jHFUK1gx244KwUA==" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-stream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", + "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", + "requires": { + "binary": "^0.3.0", + "mkdirp": "^0.5.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } +} diff --git a/agent/package.json b/agent/package.json new file mode 100644 index 0000000..68acaba --- /dev/null +++ b/agent/package.json @@ -0,0 +1,28 @@ +{ + "name": "picluster-agent", + "version": "0.0.1", + "config": { + "unsafe-perm": true + }, + "dependencies": { + "async": "latest", + "body-parser": "latest", + "child-process-promise": "", + "cpu-stats": "latest", + "diskspace": "latest", + "express": "latest", + "fd-diskspace": "latest", + "fs": "latest", + "getos": "latest", + "graceful-fs": "^4.2.6", + "line-reader": "latest", + "lodash": "^4.17.21", + "mem-stat": "latest", + "multer": "latest", + "os": "latest", + "superagent": "latest", + "sys": "latest", + "systeminformation": "latest", + "unzip-stream": "latest" + } +} diff --git a/config-example.json b/config-example.json new file mode 100644 index 0000000..213ec0b --- /dev/null +++ b/config-example.json @@ -0,0 +1,24 @@ +{ + "token": "1234567890ABCDEFGHJKLMNOP", + "docker": "../docker", + "server_port": "3000", + "agent_port": "3001", + "ssl": false, + "ssl_self_signed": false, + "ssl_cert": "", + "ssl_key": "", + "layout": [ + ], + "hb": [ + ], + "container_host_constraints": [{ + }], + "automatic_heartbeat": "enabled", + "heartbeat_interval": "10000", + "syslog": "dmesg", + "web_username": "admin", + "web_password": "admin", + "web_connect": "127.0.0.1", + "web_port": "3003", + "theme": "default" +} diff --git a/docker-compose-multi-node.yml b/docker-compose-multi-node.yml new file mode 100644 index 0000000..b33393a --- /dev/null +++ b/docker-compose-multi-node.yml @@ -0,0 +1,54 @@ +version: '3' +services: + + server: + image: "ubuntu:rolling" + restart: "always" + volumes: + - .:/picluster + - ./docker-compose-multinode.config.json:/picluster/config.json + - ./picluster-pm2.config-example.json:/picluster/picluster-pm2.config.json + ports: + - "3003:3003" + networks: + - picluster + working_dir: /picluster + command: su -s /bin/sh -lc "export DEBIAN_FRONTEND='noninteractive';apt-get update; apt-get install -y npm nodejs build-essential containerd docker.io containerd runc git python3 make g++ docker procps supervisor; cd /picluster;npm install;cd /picluster/server;/usr/bin/dockerd&npm install;cd /picluster/agent;npm install;cd /picluster/web;npm install;cd /picluster;printf \"[supervisord]\n\n[program:dockerd]\ncommand=dockerd\" > /etc/supervisor.conf; npm install -g pm2;supervisord -c /etc/supervisor.conf; npm install --production --unsafe-perm; pm2-docker start /picluster/picluster-pm2.config.json" + environment: + COMPOSE_HTTP_TIMEOUT: 600 + privileged: true + + node2: + image: "ubuntu:rolling" + restart: "always" + volumes: + - .:/picluster + - ./docker-compose-multinode.config.json:/picluster/config.json + - ./picluster-pm2.config-example.json:/picluster/picluster-pm2.config.json + networks: + - picluster + working_dir: /picluster + command: su -s /bin/sh -lc "export DEBIAN_FRONTEND='noninteractive';apt-get update; apt-get install -y npm nodejs build-essential containerd docker.io containerd runc git python3 make g++ docker procps supervisor; cd /picluster;npm install;cd /picluster/server;/usr/bin/dockerd&npm install;cd /picluster/agent;npm install;cd /picluster/web;npm install;cd /picluster;printf \"[supervisord]\n\n[program:dockerd]\ncommand=dockerd\" > /etc/supervisor.conf; npm install -g pm2;supervisord -c /etc/supervisor.conf; npm install --production --unsafe-perm; pm2-docker start /picluster/picluster-pm2.config.json" + environment: + COMPOSE_HTTP_TIMEOUT: 600 + privileged: true + + node3: + image: "ubuntu:rolling" + restart: "always" + volumes: + - .:/picluster + - ./docker-compose-multinode.config.json:/picluster/config.json + - ./picluster-pm2.config-example.json:/picluster/picluster-pm2.config.json + networks: + - picluster + working_dir: /picluster + command: su -s /bin/sh -lc "export DEBIAN_FRONTEND='noninteractive';apt-get update; apt-get install -y npm nodejs build-essential containerd docker.io containerd runc git python3 make g++ docker procps supervisor; cd /picluster;npm install;cd /picluster/server;/usr/bin/dockerd&npm install;cd /picluster/agent;npm install;cd /picluster/web;npm install;cd /picluster;printf \"[supervisord]\n\n[program:dockerd]\ncommand=dockerd\" > /etc/supervisor.conf; npm install -g pm2;supervisord -c /etc/supervisor.conf; npm install --production --unsafe-perm; pm2-docker start /picluster/picluster-pm2.config.json" + environment: + COMPOSE_HTTP_TIMEOUT: 600 + privileged: true + + +networks: + picluster: + \ No newline at end of file diff --git a/docker-compose-multinode.config.json b/docker-compose-multinode.config.json new file mode 100644 index 0000000..5c4b043 --- /dev/null +++ b/docker-compose-multinode.config.json @@ -0,0 +1,26 @@ +{ + "token": "1234567890ABCDEFGHJKLMNOP", + "docker": "../docker", + "doc_dir": "../docs", + "server_port": "3000", + "theme": "default", + "agent_port": "3001", + "ssl": false, + "ssl_self_signed": false, + "ssl_cert": "", + "ssl_key": "", + "layout": [ + + ], + "hb": [ + + ], + "container_host_constraints": [], + "automatic_heartbeat": "enabled", + "heartbeat_interval": "300000", + "syslog": "dmesg", + "web_username": "admin", + "web_password": "admin", + "web_connect": "server", + "web_port": "3003" +} \ No newline at end of file diff --git a/docker-compose-rpi.yml b/docker-compose-rpi.yml new file mode 100644 index 0000000..1a46615 --- /dev/null +++ b/docker-compose-rpi.yml @@ -0,0 +1,18 @@ +version: '3' +services: + server: + image: rusher81572/alpine + restart: "always" + volumes: + - .:/picluster + - ./docker-compose.config.json:/picluster/config.json + - ./picluster-pm2.config-example.json:/picluster/picluster-pm2.config.json + ports: + - "3000:3000" + - "3001:3001" + - "3003:3003" + working_dir: /picluster + command: ["sh", "-c", "set -e; printf 'http://mirror.clarkson.edu/alpine/edge/main\nhttp://mirror.clarkson.edu/alpine/edge/community' > /etc/apk/repositories; apk update; apk add --no-cache docker py3-setuptools git g++ make nodejs-current nodejs-current-npm openrc procps python3 supervisor; printf \"[supervisord]\n\n[program:dockerd]\ncommand=dockerd\" > /etc/supervisor.conf; npm install -g pm2; supervisord -c /etc/supervisor.conf; npm install --production --unsafe-perm; pm2-docker start picluster-pm2.config.json"] + environment: + COMPOSE_HTTP_TIMEOUT: 600 + privileged: true diff --git a/docker-compose.config.json b/docker-compose.config.json new file mode 100644 index 0000000..d314a72 --- /dev/null +++ b/docker-compose.config.json @@ -0,0 +1,26 @@ +{ + "token": "1234567890ABCDEFGHJKLMNOP", + "docker": "../docker", + "doc_dir": "../docs", + "server_port": "3000", + "theme": "default", + "agent_port": "3001", + "ssl": false, + "ssl_self_signed": false, + "ssl_cert": "", + "ssl_key": "", + "layout": [ + + ], + "hb": [ + + ], + "container_host_constraints": [], + "automatic_heartbeat": "enabled", + "heartbeat_interval": "300000", + "syslog": "dmesg", + "web_username": "admin", + "web_password": "admin", + "web_connect": "0.0.0.0", + "web_port": "3003" +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1b6d264 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3.9' +services: + server: + image: "ubuntu:rolling" + restart: "always" + volumes: + - .:/picluster + - ./docker-compose.config.json:/picluster/config.json + - ./picluster-pm2.config-example.json:/picluster/picluster-pm2.config.json + ports: + - "3000:3000" + - "3001:3001" + - "3003:3003" + working_dir: /picluster + command: su -s /bin/sh -lc "export DEBIAN_FRONTEND='noninteractive';apt-get update; apt-get install -y npm nodejs build-essential containerd docker.io containerd runc git python3 make g++ docker procps supervisor; cd /picluster;npm install;cd /picluster/server;/usr/bin/dockerd&npm install;cd /picluster/agent;npm install;cd /picluster/web;npm install;cd /picluster;printf \"[supervisord]\n\n[program:dockerd]\ncommand=dockerd\" > /etc/supervisor.conf; npm install -g pm2;supervisord -c /etc/supervisor.conf; npm install --production --unsafe-perm; pm2-docker start /picluster/picluster-pm2.config.json" + environment: + COMPOSE_HTTP_TIMEOUT: 600 + privileged: true diff --git a/docker/.gitkeep b/docker/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docker/picluster_lb.zip b/docker/picluster_lb.zip new file mode 100644 index 0000000..c9e3035 Binary files /dev/null and b/docker/picluster_lb.zip differ diff --git a/example/arm/archlinux/mysql/Dockerfile b/example/arm/archlinux/mysql/Dockerfile new file mode 100644 index 0000000..44d4fe2 --- /dev/null +++ b/example/arm/archlinux/mysql/Dockerfile @@ -0,0 +1,12 @@ +# Arch Linux ARM (Raspberry Pi 2) + +FROM scratch AS armhf-archlinux + +MAINTAINER TokinRing +LABEL Description="Arch Linux ARM (Raspberry Pi 2)" Repository="armv7/armhf-archlinux" + +ADD http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz / + +RUN pacman -Sy --noconfirm mariadb{-clients,} && pacman -Scc --noconfirm + +CMD /usr/sbin/mysql diff --git a/example/arm/archlinux/nginx/Dockerfile b/example/arm/archlinux/nginx/Dockerfile new file mode 100644 index 0000000..2decae3 --- /dev/null +++ b/example/arm/archlinux/nginx/Dockerfile @@ -0,0 +1,12 @@ +# Arch Linux ARM (Raspberry Pi 2) + +FROM scratch AS armhf-archlinux + +MAINTAINER TokinRing +LABEL Description="Arch Linux ARM (Raspberry Pi 2)" Repository="armv7/armhf-archlinux" + +ADD http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz / + +RUN pacman -Sy --noconfirm nginx && pacman -Scc --noconfirm + +CMD /usr/sbin/nginx -g "daemon off;" diff --git a/example/arm/function-sample.zip b/example/arm/function-sample.zip new file mode 100644 index 0000000..817f650 Binary files /dev/null and b/example/arm/function-sample.zip differ diff --git a/example/arm/ubuntu/minio/Dockerfile b/example/arm/ubuntu/minio/Dockerfile new file mode 100644 index 0000000..6dfd8e2 --- /dev/null +++ b/example/arm/ubuntu/minio/Dockerfile @@ -0,0 +1,5 @@ +FROM armv7/armhf-ubuntu +RUN apt-get update;apt-get install wget -y +RUN wget https://dl.minio.io/server/minio/release/linux-amd64/minio +RUN chmod +x minio +CMD ./minio server /tmp diff --git a/example/arm/ubuntu/mysql/50-server.cnf b/example/arm/ubuntu/mysql/50-server.cnf new file mode 100644 index 0000000..d151287 --- /dev/null +++ b/example/arm/ubuntu/mysql/50-server.cnf @@ -0,0 +1,130 @@ +# +# These groups are read by MariaDB server. +# Use it for options that only the server (but not clients) should see +# +# See the examples of server my.cnf files in /usr/share/mysql/ +# + +# this is read by the standalone daemon and embedded servers +[server] + +# this is only for the mysqld standalone daemon +[mysqld] + +# +# * Basic Settings +# +#user = mysql +user = root +pid-file = /var/run/mysqld/mysqld.pid +socket = /var/run/mysqld/mysqld.sock +port = 3306 +basedir = /usr +datadir = /var/lib/mysql +tmpdir = /tmp +lc-messages-dir = /usr/share/mysql +skip-external-locking +log_bin = /var/log/mysql/mysql-bin.log +binlog_format = MIXED +# Instead of skip-networking the default is now to listen only on +# localhost which is more compatible and is not less secure. +bind-address = 0.0.0.0 + +# +# * Fine Tuning +# +key_buffer_size = 16M +max_allowed_packet = 16M +thread_stack = 192K +thread_cache_size = 8 +# This replaces the startup script and checks MyISAM tables if needed +# the first time they are touched +myisam-recover = BACKUP +#max_connections = 100 +#table_cache = 64 +#thread_concurrency = 10 + +# +# * Query Cache Configuration +# +query_cache_limit = 1M +query_cache_size = 16M + +# +# * Logging and Replication +# +# Both location gets rotated by the cronjob. +# Be aware that this log type is a performance killer. +# As of 5.1 you can enable the log at runtime! +#general_log_file = /var/log/mysql/mysql.log +#general_log = 1 +# +# Error log - should be very few entries. +# +log_error = /var/log/mysql/error.log +# +# Enable the slow query log to see queries with especially long duration +#slow_query_log_file = /var/log/mysql/mariadb-slow.log +#long_query_time = 10 +#log_slow_rate_limit = 1000 +#log_slow_verbosity = query_plan +#log-queries-not-using-indexes +# +# The following can be used as easy to replay backup logs or for replication. +# note: if you are setting up a replication slave, see README.Debian about +# other settings you may need to change. +#server-id = 1 +#log_bin = /var/log/mysql/mysql-bin.log +expire_logs_days = 10 +max_binlog_size = 100M +#binlog_do_db = include_database_name +#binlog_ignore_db = include_database_name + +# +# * InnoDB +# +# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. +# Read the manual for more InnoDB related options. There are many! + +# +# * Security Features +# +# Read the manual, too, if you want chroot! +# chroot = /var/lib/mysql/ +# +# For generating SSL certificates I recommend the OpenSSL GUI "tinyca". +# +# ssl-ca=/etc/mysql/cacert.pem +# ssl-cert=/etc/mysql/server-cert.pem +# ssl-key=/etc/mysql/server-key.pem + +# +# * Character sets +# +# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full +# utf8 4-byte character set. See also client.cnf +# +character-set-server = utf8mb4 +collation-server = utf8mb4_general_ci + +# +# * Unix socket authentication plugin is built-in since 10.0.22-6 +# +# Needed so the root database #user can authenticate without a password but +# only when running as the unix root #user. +# +# Also available for other #users if required. +# See https://mariadb.com/kb/en/unix_socket-authentication-plugin/ + +# this is only for embedded server +[embedded] + +# This group is only read by MariaDB servers, not by MySQL. +# If you use the same .cnf file for MySQL and MariaDB, +# you can put MariaDB-only options here +[mariadb] + +# This group is only read by MariaDB-10.0 servers. +# If you use the same .cnf file for MariaDB of different versions, +# use this group for options that older servers don't understand +[mariadb-10.0] diff --git a/example/arm/ubuntu/mysql/Dockerfile b/example/arm/ubuntu/mysql/Dockerfile new file mode 100644 index 0000000..caf6584 --- /dev/null +++ b/example/arm/ubuntu/mysql/Dockerfile @@ -0,0 +1,24 @@ +FROM armv7/armhf-ubuntu +ENV sql_password sql +ENV TERM xterm +RUN apt-get update; DEBIAN_FRONTEND=noninteractive apt-get -y install cron mariadb-client mariadb-server + +#Cron Jobs +RUN echo "00 23 * * 0 /sync.sh" >> /crontab +RUN echo "00 * * * * mysqladmin flush-hosts" >> /crontab +RUN crontab /crontab +ADD sync.sh / +RUN chmod +x /sync.sh + +#MySQL Config +ADD 50-server.cnf /etc/mysql/mariadb.conf.d/ + +RUN rm -rf /var/lib/mysql/* + +#Startup Script +ADD start.sh / +RUN chmod +x /start.sh + + +EXPOSE 3306 +CMD /start.sh diff --git a/example/arm/ubuntu/mysql/start.sh b/example/arm/ubuntu/mysql/start.sh new file mode 100644 index 0000000..9bc147a --- /dev/null +++ b/example/arm/ubuntu/mysql/start.sh @@ -0,0 +1,17 @@ +#!/bin/bash +cron +chown -R mysql:mysql /var/lib/mysql + +if [ "$(ls -A /var/lib/mysql)" ]; then + echo "Found existing MySQL Data......" + mysqld_safe --max_connect_errors=10000 --user root& + sleep infinity +else + echo "No existing database found......" + mysql_install_db --user root + mysqld_safe --max_connect_errors=10000 --user root& + sleep 10 + mysqladmin -u root password $sql_password + mysql -u root -p$sql_password -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '" + $sql_password + "' WITH GRANT OPTION; FLUSH PRIVILEGES;" + sleep infinity +fi diff --git a/example/arm/ubuntu/mysql/sync.sh b/example/arm/ubuntu/mysql/sync.sh new file mode 100644 index 0000000..b12437c --- /dev/null +++ b/example/arm/ubuntu/mysql/sync.sh @@ -0,0 +1,2 @@ +#!/bin/bash +mysqldump -u root -p$sql_password --all-databases > /saves/database-`date +%Y-%m-%d`.sql diff --git a/example/arm/ubuntu/nginx/Dockerfile b/example/arm/ubuntu/nginx/Dockerfile new file mode 100644 index 0000000..71cc5bc --- /dev/null +++ b/example/arm/ubuntu/nginx/Dockerfile @@ -0,0 +1,11 @@ +FROM armv7/armhf-ubuntu +RUN apt-get update;apt-get install -y nginx + +#ENV Variables +ENV TERM xterm + +#Run in foreground +RUN sed -i '1s/^/daemon off; /' /etc/nginx/nginx.conf +EXPOSE 443 80 + +CMD nginx diff --git a/example/x86_64/ubuntu/function-sample.zip b/example/x86_64/ubuntu/function-sample.zip new file mode 100644 index 0000000..8f86760 Binary files /dev/null and b/example/x86_64/ubuntu/function-sample.zip differ diff --git a/example/x86_64/ubuntu/minio/Dockerfile b/example/x86_64/ubuntu/minio/Dockerfile new file mode 100644 index 0000000..015a085 --- /dev/null +++ b/example/x86_64/ubuntu/minio/Dockerfile @@ -0,0 +1,5 @@ +FROM ubuntu +RUN apt-get update;apt-get install wget -y +RUN wget https://dl.minio.io/server/minio/release/linux-amd64/minio +RUN chmod +x minio +CMD ./minio server /tmp diff --git a/example/x86_64/ubuntu/mysql/50-server.cnf b/example/x86_64/ubuntu/mysql/50-server.cnf new file mode 100644 index 0000000..d151287 --- /dev/null +++ b/example/x86_64/ubuntu/mysql/50-server.cnf @@ -0,0 +1,130 @@ +# +# These groups are read by MariaDB server. +# Use it for options that only the server (but not clients) should see +# +# See the examples of server my.cnf files in /usr/share/mysql/ +# + +# this is read by the standalone daemon and embedded servers +[server] + +# this is only for the mysqld standalone daemon +[mysqld] + +# +# * Basic Settings +# +#user = mysql +user = root +pid-file = /var/run/mysqld/mysqld.pid +socket = /var/run/mysqld/mysqld.sock +port = 3306 +basedir = /usr +datadir = /var/lib/mysql +tmpdir = /tmp +lc-messages-dir = /usr/share/mysql +skip-external-locking +log_bin = /var/log/mysql/mysql-bin.log +binlog_format = MIXED +# Instead of skip-networking the default is now to listen only on +# localhost which is more compatible and is not less secure. +bind-address = 0.0.0.0 + +# +# * Fine Tuning +# +key_buffer_size = 16M +max_allowed_packet = 16M +thread_stack = 192K +thread_cache_size = 8 +# This replaces the startup script and checks MyISAM tables if needed +# the first time they are touched +myisam-recover = BACKUP +#max_connections = 100 +#table_cache = 64 +#thread_concurrency = 10 + +# +# * Query Cache Configuration +# +query_cache_limit = 1M +query_cache_size = 16M + +# +# * Logging and Replication +# +# Both location gets rotated by the cronjob. +# Be aware that this log type is a performance killer. +# As of 5.1 you can enable the log at runtime! +#general_log_file = /var/log/mysql/mysql.log +#general_log = 1 +# +# Error log - should be very few entries. +# +log_error = /var/log/mysql/error.log +# +# Enable the slow query log to see queries with especially long duration +#slow_query_log_file = /var/log/mysql/mariadb-slow.log +#long_query_time = 10 +#log_slow_rate_limit = 1000 +#log_slow_verbosity = query_plan +#log-queries-not-using-indexes +# +# The following can be used as easy to replay backup logs or for replication. +# note: if you are setting up a replication slave, see README.Debian about +# other settings you may need to change. +#server-id = 1 +#log_bin = /var/log/mysql/mysql-bin.log +expire_logs_days = 10 +max_binlog_size = 100M +#binlog_do_db = include_database_name +#binlog_ignore_db = include_database_name + +# +# * InnoDB +# +# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. +# Read the manual for more InnoDB related options. There are many! + +# +# * Security Features +# +# Read the manual, too, if you want chroot! +# chroot = /var/lib/mysql/ +# +# For generating SSL certificates I recommend the OpenSSL GUI "tinyca". +# +# ssl-ca=/etc/mysql/cacert.pem +# ssl-cert=/etc/mysql/server-cert.pem +# ssl-key=/etc/mysql/server-key.pem + +# +# * Character sets +# +# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full +# utf8 4-byte character set. See also client.cnf +# +character-set-server = utf8mb4 +collation-server = utf8mb4_general_ci + +# +# * Unix socket authentication plugin is built-in since 10.0.22-6 +# +# Needed so the root database #user can authenticate without a password but +# only when running as the unix root #user. +# +# Also available for other #users if required. +# See https://mariadb.com/kb/en/unix_socket-authentication-plugin/ + +# this is only for embedded server +[embedded] + +# This group is only read by MariaDB servers, not by MySQL. +# If you use the same .cnf file for MySQL and MariaDB, +# you can put MariaDB-only options here +[mariadb] + +# This group is only read by MariaDB-10.0 servers. +# If you use the same .cnf file for MariaDB of different versions, +# use this group for options that older servers don't understand +[mariadb-10.0] diff --git a/example/x86_64/ubuntu/mysql/Dockerfile b/example/x86_64/ubuntu/mysql/Dockerfile new file mode 100644 index 0000000..93e4499 --- /dev/null +++ b/example/x86_64/ubuntu/mysql/Dockerfile @@ -0,0 +1,24 @@ +FROM ubuntu +ENV sql_password sql +ENV TERM xterm +RUN apt-get update; DEBIAN_FRONTEND=noninteractive apt-get -y install cron mariadb-client mariadb-server + +#Cron Jobs +RUN echo "00 23 * * 0 /sync.sh" >> /crontab +RUN echo "00 * * * * mysqladmin flush-hosts" >> /crontab +RUN crontab /crontab +ADD sync.sh / +RUN chmod +x /sync.sh + +#MySQL Config +ADD 50-server.cnf /etc/mysql/mariadb.conf.d/ + +RUN rm -rf /var/lib/mysql/* + +#Startup Script +ADD start.sh / +RUN chmod +x /start.sh + + +EXPOSE 3306 +CMD /start.sh diff --git a/example/x86_64/ubuntu/mysql/start.sh b/example/x86_64/ubuntu/mysql/start.sh new file mode 100644 index 0000000..9bc147a --- /dev/null +++ b/example/x86_64/ubuntu/mysql/start.sh @@ -0,0 +1,17 @@ +#!/bin/bash +cron +chown -R mysql:mysql /var/lib/mysql + +if [ "$(ls -A /var/lib/mysql)" ]; then + echo "Found existing MySQL Data......" + mysqld_safe --max_connect_errors=10000 --user root& + sleep infinity +else + echo "No existing database found......" + mysql_install_db --user root + mysqld_safe --max_connect_errors=10000 --user root& + sleep 10 + mysqladmin -u root password $sql_password + mysql -u root -p$sql_password -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '" + $sql_password + "' WITH GRANT OPTION; FLUSH PRIVILEGES;" + sleep infinity +fi diff --git a/example/x86_64/ubuntu/mysql/sync.sh b/example/x86_64/ubuntu/mysql/sync.sh new file mode 100644 index 0000000..b12437c --- /dev/null +++ b/example/x86_64/ubuntu/mysql/sync.sh @@ -0,0 +1,2 @@ +#!/bin/bash +mysqldump -u root -p$sql_password --all-databases > /saves/database-`date +%Y-%m-%d`.sql diff --git a/example/x86_64/ubuntu/nginx/Dockerfile b/example/x86_64/ubuntu/nginx/Dockerfile new file mode 100644 index 0000000..1a050cb --- /dev/null +++ b/example/x86_64/ubuntu/nginx/Dockerfile @@ -0,0 +1,12 @@ +FROM ubuntu +#FROM armv7/armhf-ubuntu +RUN apt-get update;apt-get install -y nginx + +#ENV Variables +ENV TERM xterm + +#Run in foreground +RUN sed -i '1s/^/daemon off; /' /etc/nginx/nginx.conf +EXPOSE 443 80 + +CMD nginx diff --git a/grafana-dashboard-7.x.json b/grafana-dashboard-7.x.json new file mode 100644 index 0000000..5795ab7 --- /dev/null +++ b/grafana-dashboard-7.x.json @@ -0,0 +1,857 @@ +{ + "__inputs": [ + { + "name": "DS_ELASTICSEARCH", + "label": "Elasticsearch", + "description": "", + "type": "datasource", + "pluginId": "elasticsearch", + "pluginName": "Elasticsearch" + } + ], + "__requires": [ + { + "type": "datasource", + "id": "elasticsearch", + "name": "Elasticsearch", + "version": "1.0.0" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.1.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "$$hashKey": "object:240", + "fake": true, + "field": "node.keyword", + "id": "3", + "settings": { + "min_doc_count": 0, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "$$hashKey": "object:241", + "field": "date", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "metrics": [ + { + "$$hashKey": "object:238", + "field": "network_rx", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Network - In", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "KB/s", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": "Date", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "hiddenSeries": false, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "$$hashKey": "object:581", + "fake": true, + "field": "node.keyword", + "id": "3", + "settings": { + "min_doc_count": 0, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "$$hashKey": "object:582", + "field": "date", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "metrics": [ + { + "$$hashKey": "object:579", + "field": "network_tx", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Network - Out", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "KB/s", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": "Date", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "$$hashKey": "object:416", + "fake": true, + "field": "node.keyword", + "id": "3", + "settings": { + "min_doc_count": 0, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "$$hashKey": "object:417", + "field": "date", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "elasticsearch", + "metrics": [ + { + "$$hashKey": "object:414", + "field": "cpu", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "PiCluster CPU Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 9 + }, + "hiddenSeries": false, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "$$hashKey": "object:638", + "fake": true, + "field": "node.keyword", + "id": "3", + "settings": { + "min_doc_count": 0, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "$$hashKey": "object:639", + "field": "date", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "elasticsearch", + "metrics": [ + { + "$$hashKey": "object:636", + "field": "memory", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "PiCluster Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "$$hashKey": "object:933", + "fake": true, + "field": "node.keyword", + "id": "3", + "settings": { + "min_doc_count": 0, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "$$hashKey": "object:934", + "field": "date", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "metrics": [ + { + "$$hashKey": "object:931", + "field": "total_running_containers", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "PiCluster Running Containers", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "$$hashKey": "object:1165", + "fake": true, + "field": "node.keyword", + "id": "3", + "settings": { + "min_doc_count": 1, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "$$hashKey": "object:1166", + "field": "date", + "id": "2", + "settings": { + "interval": "1m", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "elasticsearch", + "metrics": [ + { + "$$hashKey": "object:1163", + "field": "disk", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "PiCluster Disk Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": false, + "schemaVersion": 26, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "PiCluster Monitoring", + "uid": "sdFDxU0ik", + "version": 13 +} \ No newline at end of file diff --git a/grafana-dashboard.json b/grafana-dashboard.json new file mode 100644 index 0000000..9e27d7c --- /dev/null +++ b/grafana-dashboard.json @@ -0,0 +1,779 @@ +{ + "__inputs": [ + { + "name": "DS_ELASTICSEARCH", + "label": "Elasticsearch", + "description": "", + "type": "datasource", + "pluginId": "elasticsearch", + "pluginName": "Elasticsearch" + } + ], + "__requires": [ + { + "type": "datasource", + "id": "elasticsearch", + "name": "Elasticsearch", + "version": "5.0.0" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "5.3.0" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "5.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "fake": true, + "field": "node", + "id": "3", + "settings": { + "min_doc_count": 1, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "field": "date", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "metrics": [ + { + "field": "network_rx", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network - In", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "KB/s", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": "Date", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "fake": true, + "field": "node", + "id": "3", + "settings": { + "min_doc_count": 1, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "field": "date", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "metrics": [ + { + "field": "network_tx", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network - Out", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "KB/s", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": "Date", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "fake": true, + "field": "node", + "id": "3", + "settings": { + "min_doc_count": 1, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "field": "date", + "id": "2", + "settings": { + "interval": "1m", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "elasticsearch", + "metrics": [ + { + "field": "cpu", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "PiCluster CPU Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "fake": true, + "field": "node", + "id": "3", + "settings": { + "min_doc_count": 1, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "field": "date", + "id": "2", + "settings": { + "interval": "1m", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "elasticsearch", + "metrics": [ + { + "field": "memory", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "PiCluster Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "fake": true, + "field": "node", + "id": "3", + "settings": { + "min_doc_count": 1, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "field": "date", + "id": "2", + "settings": { + "interval": "1m", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "metrics": [ + { + "field": "total_running_containers", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "PiCluster Running Containers", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_ELASTICSEARCH}", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 4, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "bucketAggs": [ + { + "fake": true, + "field": "node", + "id": "3", + "settings": { + "min_doc_count": 1, + "order": "desc", + "orderBy": "_term", + "size": "10" + }, + "type": "terms" + }, + { + "field": "date", + "id": "2", + "settings": { + "interval": "1m", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "elasticsearch", + "metrics": [ + { + "field": "disk", + "id": "1", + "meta": {}, + "settings": {}, + "type": "max" + } + ], + "refId": "A", + "timeField": "date" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "PiCluster Disk Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": false, + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "PiCluster Monitoring", + "uid": "sdFDxU0ik", + "version": 21 +} \ No newline at end of file diff --git a/images/faas-0.png b/images/faas-0.png new file mode 100644 index 0000000..a6f1f4f Binary files /dev/null and b/images/faas-0.png differ diff --git a/images/faas-1.png b/images/faas-1.png new file mode 100644 index 0000000..45eecc4 Binary files /dev/null and b/images/faas-1.png differ diff --git a/images/faas-2.png b/images/faas-2.png new file mode 100644 index 0000000..7d0757e Binary files /dev/null and b/images/faas-2.png differ diff --git a/images/picluster-mainscreen.png b/images/picluster-mainscreen.png new file mode 100644 index 0000000..81c4534 Binary files /dev/null and b/images/picluster-mainscreen.png differ diff --git a/images/piclusterLogo.png b/images/piclusterLogo.png new file mode 100644 index 0000000..4e4301f Binary files /dev/null and b/images/piclusterLogo.png differ diff --git a/kibana-dashboards-7x.ndjson b/kibana-dashboards-7x.ndjson new file mode 100644 index 0000000..645a3da --- /dev/null +++ b/kibana-dashboards-7x.ndjson @@ -0,0 +1,12 @@ +{"attributes":{"fields":"[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"cpu\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"date\",\"type\":\"date\",\"esTypes\":[\"date\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"disk\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"memory\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"network_rx\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"network_tx\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"node\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"node.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"node\"}}},{\"name\":\"total_running_containers\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"date","title":"picluster-monitoring"},"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2020-07-08T03:31:11.746Z","version":"WzcwOSwyXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[]}"},"title":"Network Traffic - Outbound","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"line\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"network_tx\",\"customLabel\":\"KB/s\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now/d\",\"to\":\"now/d\"},\"useNormalizedEsInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Time\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node.keyword\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}],\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"KB/s\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"KB/s\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}},\"title\":\"Network Traffic - Outbound\"}"},"id":"0f34ec00-f7e8-11e8-9315-e546074942c0","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-07-08T03:48:32.946Z","version":"Wzc1NCwyXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[]}"},"title":"Disk Utilization","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"line\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"disk\",\"customLabel\":\"Disk Usage\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now/d\",\"to\":\"now/d\"},\"useNormalizedEsInterval\":true,\"scaleMetricValues\":true,\"interval\":\"m\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"TIme\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node.keyword\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}],\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Disk Usage\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"Disk Usage\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"cardinal\",\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":true,\"labels\":{},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}},\"title\":\"Disk Utilization\"}"},"id":"228389f0-fc18-11e7-8b37-0f171231376a","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-07-08T03:47:09.601Z","version":"Wzc1MSwyXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[]}"},"title":"CPU Utilization","uiStateJSON":"{\"spy\":{\"mode\":{\"fill\":false,\"name\":null}}}","version":1,"visState":"{\"type\":\"line\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"cpu\",\"customLabel\":\"CPU Usage\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now/d\",\"to\":\"now/d\"},\"useNormalizedEsInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Time\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node.keyword\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}],\"params\":{\"addLegend\":true,\"addTimeMarker\":true,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"},\"valueAxis\":null},\"labels\":{},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"CPU Usage\"},\"drawLinesBetweenPoints\":true,\"interpolate\":\"cardinal\",\"lineWidth\":4,\"mode\":\"normal\",\"show\":\"true\",\"showCircles\":true,\"type\":\"line\",\"valueAxis\":\"ValueAxis-1\"}],\"thresholdLine\":{\"color\":\"#E7664C\",\"show\":false,\"style\":\"full\",\"value\":10,\"width\":1},\"times\":[],\"type\":\"line\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"CPU Usage\"},\"type\":\"value\"}]},\"title\":\"CPU Utilization\"}"},"id":"e2dc1150-fc17-11e7-8b37-0f171231376a","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-07-08T03:46:50.402Z","version":"Wzc1MCwyXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[]}"},"title":"Memory Utilization","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"line\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"memory\",\"customLabel\":\"Memory Usasge\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now/d\",\"to\":\"now/d\"},\"useNormalizedEsInterval\":true,\"scaleMetricValues\":true,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date and TIme\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node.keyword\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}],\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Memory Usasge\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"Memory Usasge\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"lineWidth\":4,\"interpolate\":\"cardinal\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":true,\"labels\":{},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}},\"title\":\"Memory Utilization\"}"},"id":"6852f010-fc18-11e7-8b37-0f171231376a","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-07-08T03:44:59.045Z","version":"Wzc0OCwyXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[]}"},"title":"Node Statistics Table","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"cpu\",\"customLabel\":\"CPU %\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"disk\",\"customLabel\":\"Disk %\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"disk\",\"customLabel\":\"Memory %\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"total_running_containers\",\"customLabel\":\"Running Containers\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"node.keyword\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Node\"}}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"showMetricsAtAllLevels\":false,\"percentageCol\":\"\"},\"title\":\"Node Statistics Table\"}"},"id":"fd1ac550-fc9b-11e7-8b37-0f171231376a","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-07-08T03:51:29.498Z","version":"Wzc1OSwyXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\n \"query\": {\n \"query\": \"\",\n \"language\": \"lucene\"\n },\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\",\n \"filter\": []\n}"},"title":"Running Containers","uiStateJSON":"{\n \"spy\": {\n \"mode\": {\n \"name\": null,\n \"fill\": false\n }\n }\n}","version":1,"visState":"{\n \"type\": \"line\",\n \"aggs\": [\n {\n \"id\": \"1\",\n \"enabled\": true,\n \"type\": \"max\",\n \"schema\": \"metric\",\n \"params\": {\n \"field\": \"total_running_containers\",\n \"customLabel\": \"Running Containers\"\n }\n },\n {\n \"id\": \"2\",\n \"enabled\": true,\n \"type\": \"date_histogram\",\n \"schema\": \"segment\",\n \"params\": {\n \"field\": \"date\",\n \"timeRange\": {\n \"from\": \"now/d\",\n \"to\": \"now/d\"\n },\n \"useNormalizedEsInterval\": true,\n \"scaleMetricValues\": true,\n \"interval\": \"m\",\n \"drop_partials\": false,\n \"min_doc_count\": 1,\n \"extended_bounds\": {},\n \"customLabel\": \"Date and TIme\"\n }\n }\n ],\n \"params\": {\n \"type\": \"line\",\n \"grid\": {\n \"categoryLines\": true,\n \"style\": {\n \"color\": \"#eee\"\n },\n \"valueAxis\": null\n },\n \"categoryAxes\": [\n {\n \"id\": \"CategoryAxis-1\",\n \"type\": \"category\",\n \"position\": \"bottom\",\n \"show\": true,\n \"style\": {},\n \"scale\": {\n \"type\": \"linear\"\n },\n \"labels\": {\n \"show\": true,\n \"truncate\": 100\n },\n \"title\": {}\n }\n ],\n \"valueAxes\": [\n {\n \"id\": \"ValueAxis-1\",\n \"name\": \"LeftAxis-1\",\n \"type\": \"value\",\n \"position\": \"left\",\n \"show\": true,\n \"style\": {},\n \"scale\": {\n \"type\": \"linear\",\n \"mode\": \"normal\"\n },\n \"labels\": {\n \"show\": true,\n \"rotate\": 0,\n \"filter\": false,\n \"truncate\": 100\n },\n \"title\": {\n \"text\": \"Running Containers\"\n }\n }\n ],\n \"seriesParams\": [\n {\n \"show\": \"true\",\n \"type\": \"line\",\n \"mode\": \"normal\",\n \"data\": {\n \"label\": \"Running Containers\",\n \"id\": \"1\"\n },\n \"valueAxis\": \"ValueAxis-1\",\n \"drawLinesBetweenPoints\": true,\n \"showCircles\": true,\n \"interpolate\": \"cardinal\",\n \"lineWidth\": 4\n }\n ],\n \"addTooltip\": true,\n \"addLegend\": true,\n \"legendPosition\": \"right\",\n \"times\": [],\n \"addTimeMarker\": true,\n \"labels\": {},\n \"thresholdLine\": {\n \"show\": false,\n \"value\": 10,\n \"width\": 1,\n \"style\": \"full\",\n \"color\": \"#E7664C\"\n }\n },\n \"title\": \"Running Containers\"\n}"},"id":"a15d3b10-fe50-11e7-83ef-db4c0a03c23e","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-07-08T03:41:24.710Z","version":"WzczOCwyXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[]}"},"title":"Network Traffic - Inbound","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"line\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"network_rx\",\"customLabel\":\"KB/s\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now/d\",\"to\":\"now/d\"},\"useNormalizedEsInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Time\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node.keyword\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"\"}}],\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"KB/s\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"KB/s\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}},\"title\":\"Network Traffic - Inbound\"}"},"id":"63094ca0-f7e7-11e8-9315-e546074942c0","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"779acff0-c0cb-11ea-8cd5-0350424f6261","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-07-08T03:47:37.811Z","version":"Wzc1MiwyXQ=="} +{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"highlightAll\":true,\"version\":true,\"filter\":[]}"},"optionsJSON":"{\"darkTheme\":false,\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":12,\"i\":\"1\"},\"panelIndex\":\"1\",\"version\":\"7.3.0\",\"panelRefName\":\"panel_0\"},{\"gridData\":{\"x\":24,\"y\":0,\"w\":24,\"h\":12,\"i\":\"2\"},\"panelIndex\":\"2\",\"version\":\"7.3.0\",\"panelRefName\":\"panel_1\"},{\"gridData\":{\"x\":0,\"y\":12,\"w\":24,\"h\":12,\"i\":\"3\"},\"panelIndex\":\"3\",\"version\":\"7.3.0\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"gridData\":{\"x\":0,\"y\":39,\"w\":24,\"h\":12,\"i\":\"4\"},\"panelIndex\":\"4\",\"version\":\"7.3.0\",\"panelRefName\":\"panel_3\"},{\"gridData\":{\"x\":24,\"y\":12,\"w\":24,\"h\":12,\"i\":\"5\"},\"panelIndex\":\"5\",\"version\":\"7.3.0\",\"panelRefName\":\"panel_4\"},{\"gridData\":{\"x\":24,\"y\":24,\"w\":24,\"h\":15,\"i\":\"6\"},\"version\":\"7.3.0\",\"panelIndex\":\"6\",\"embeddableConfig\":{},\"panelRefName\":\"panel_5\"},{\"gridData\":{\"x\":0,\"y\":24,\"w\":24,\"h\":15,\"i\":\"7\"},\"version\":\"7.3.0\",\"panelIndex\":\"7\",\"embeddableConfig\":{},\"panelRefName\":\"panel_6\"}]","timeRestore":false,"title":"PiCluster Monitoring","version":1},"id":"2f297a00-fe22-11e7-91c4-8b295d0944b0","migrationVersion":{"dashboard":"7.3.0"},"references":[{"id":"e2dc1150-fc17-11e7-8b37-0f171231376a","name":"panel_0","type":"visualization"},{"id":"228389f0-fc18-11e7-8b37-0f171231376a","name":"panel_1","type":"visualization"},{"id":"6852f010-fc18-11e7-8b37-0f171231376a","name":"panel_2","type":"visualization"},{"id":"fd1ac550-fc9b-11e7-8b37-0f171231376a","name":"panel_3","type":"visualization"},{"id":"a15d3b10-fe50-11e7-83ef-db4c0a03c23e","name":"panel_4","type":"visualization"},{"id":"63094ca0-f7e7-11e8-9315-e546074942c0","name":"panel_5","type":"visualization"},{"id":"0f34ec00-f7e8-11e8-9315-e546074942c0","name":"panel_6","type":"visualization"}],"type":"dashboard","updated_at":"2020-07-08T03:27:39.188Z","version":"WzY5MCwyXQ=="} +{"attributes":{"buildNum":31997,"defaultIndex":"ea8cdbc0-f81d-11e8-9bed-e1397b7d7416"},"id":"7.8.0","references":[],"type":"config","updated_at":"2020-07-08T03:30:58.587Z","version":"WzcwNywyXQ=="} +{"attributes":{"fields":"[{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"data\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"date\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"date","title":"picluster-logging"},"id":"ea8cdbc0-f81d-11e8-9bed-e1397b7d7416","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2020-07-08T03:27:39.188Z","version":"WzY5MiwyXQ=="} +{"exportedCount":11,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file diff --git a/kibana-graphs.json b/kibana-graphs.json new file mode 100644 index 0000000..298c382 --- /dev/null +++ b/kibana-graphs.json @@ -0,0 +1,170 @@ +[ + { + "_id": "2614d680-f81d-11e8-9bed-e1397b7d7416", + "_type": "index-pattern", + "_source": { + "title": "picluster-monitoring", + "timeFieldName": "date", + "fields": "[{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"cpu\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"date\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"disk\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"memory\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"network_rx\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"network_tx\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"node\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"total_running_containers\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]" + }, + "_meta": { + "savedObjectVersion": 2 + }, + "_migrationVersion": { + "index-pattern": "6.5.0" + } + }, + { + "_id": "a15d3b10-fe50-11e7-83ef-db4c0a03c23e", + "_type": "visualization", + "_source": { + "title": "Running Containers", + "visState": "{\"title\":\"Running Containers\",\"type\":\"line\",\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"},\"valueAxis\":null},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Running Containers\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"Running Containers\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"cardinal\",\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":true},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"total_running_containers\",\"customLabel\":\"Running Containers\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"interval\":\"m\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date and TIme\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}]}", + "uiStateJSON": "{\"spy\":{\"mode\":{\"name\":null,\"fill\":false}}}", + "description": "", + "version": 1, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"2614d680-f81d-11e8-9bed-e1397b7d7416\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "6852f010-fc18-11e7-8b37-0f171231376a", + "_type": "visualization", + "_source": { + "title": "Memory Utilization", + "visState": "{\"title\":\"Memory Utilization\",\"type\":\"line\",\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Memory Utilization %\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"Memory Utilization %\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"lineWidth\":4,\"interpolate\":\"cardinal\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":true},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"memory\",\"customLabel\":\"Memory Utilization %\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"interval\":\"m\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date and TIme\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}]}", + "uiStateJSON": "{}", + "description": "", + "version": 1, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"2614d680-f81d-11e8-9bed-e1397b7d7416\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "e2dc1150-fc17-11e7-8b37-0f171231376a", + "_type": "visualization", + "_source": { + "title": "CPU Utilization", + "visState": "{\"title\":\"CPU Utilization\",\"type\":\"line\",\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"},\"valueAxis\":null},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"CPU %\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"CPU %\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"cardinal\",\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":true},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"cpu\",\"customLabel\":\"CPU %\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"interval\":\"m\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date and TIme\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}]}", + "uiStateJSON": "{\"spy\":{\"mode\":{\"name\":null,\"fill\":false}}}", + "description": "", + "version": 1, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"2614d680-f81d-11e8-9bed-e1397b7d7416\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "fd1ac550-fc9b-11e7-8b37-0f171231376a", + "_type": "visualization", + "_source": { + "title": "Node Statistics Table", + "visState": "{\"title\":\"Node Statistics Table\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"cpu\",\"customLabel\":\"CPU %\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"node\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Node Statistics Table\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"disk\",\"customLabel\":\"Disk %\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"memory\",\"customLabel\":\"Memory %\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"total_running_containers\",\"customLabel\":\"Running Containers\"}}]}", + "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", + "description": "", + "version": 1, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"2614d680-f81d-11e8-9bed-e1397b7d7416\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "228389f0-fc18-11e7-8b37-0f171231376a", + "_type": "visualization", + "_source": { + "title": "Disk Utilization", + "visState": "{\"title\":\"Disk Utilization\",\"type\":\"line\",\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"DIsk Utilization %\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"DIsk Utilization %\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"cardinal\",\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":true},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"disk\",\"customLabel\":\"DIsk Utilization %\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"interval\":\"m\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date and TIme\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}]}", + "uiStateJSON": "{}", + "description": "", + "version": 1, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"2614d680-f81d-11e8-9bed-e1397b7d7416\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "2f297a00-fe22-11e7-91c4-8b295d0944b0", + "_type": "dashboard", + "_source": { + "title": "PiCluster Monitoring", + "hits": 0, + "description": "", + "panelsJSON": "[{\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":12,\"i\":\"1\"},\"id\":\"e2dc1150-fc17-11e7-8b37-0f171231376a\",\"panelIndex\":\"1\",\"type\":\"visualization\",\"version\":\"6.5.1\"},{\"gridData\":{\"x\":24,\"y\":0,\"w\":24,\"h\":12,\"i\":\"2\"},\"id\":\"228389f0-fc18-11e7-8b37-0f171231376a\",\"panelIndex\":\"2\",\"type\":\"visualization\",\"version\":\"6.5.1\"},{\"gridData\":{\"x\":0,\"y\":12,\"w\":24,\"h\":12,\"i\":\"3\"},\"id\":\"6852f010-fc18-11e7-8b37-0f171231376a\",\"panelIndex\":\"3\",\"type\":\"visualization\",\"version\":\"6.5.1\"},{\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"gridData\":{\"x\":0,\"y\":39,\"w\":24,\"h\":12,\"i\":\"4\"},\"id\":\"fd1ac550-fc9b-11e7-8b37-0f171231376a\",\"panelIndex\":\"4\",\"type\":\"visualization\",\"version\":\"6.5.1\"},{\"gridData\":{\"x\":24,\"y\":12,\"w\":24,\"h\":12,\"i\":\"5\"},\"id\":\"a15d3b10-fe50-11e7-83ef-db4c0a03c23e\",\"panelIndex\":\"5\",\"type\":\"visualization\",\"version\":\"6.5.1\"},{\"gridData\":{\"x\":24,\"y\":24,\"w\":24,\"h\":15,\"i\":\"6\"},\"version\":\"6.5.1\",\"panelIndex\":\"6\",\"type\":\"visualization\",\"id\":\"63094ca0-f7e7-11e8-9315-e546074942c0\",\"embeddableConfig\":{}},{\"gridData\":{\"x\":0,\"y\":24,\"w\":24,\"h\":15,\"i\":\"7\"},\"version\":\"6.5.1\",\"panelIndex\":\"7\",\"type\":\"visualization\",\"id\":\"0f34ec00-f7e8-11e8-9315-e546074942c0\",\"embeddableConfig\":{}}]", + "optionsJSON": "{\"darkTheme\":false,\"hidePanelTitles\":false,\"useMargins\":true}", + "version": 1, + "timeRestore": false, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[],\"highlightAll\":true,\"version\":true}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "63094ca0-f7e7-11e8-9315-e546074942c0", + "_type": "visualization", + "_source": { + "title": "Network Traffic - Inbound", + "visState": "{\"title\":\"Network Traffic - Inbound\",\"type\":\"line\",\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"KB/s\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"KB/s\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"network_rx\",\"customLabel\":\"KB/s\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now-15m\",\"to\":\"now\",\"mode\":\"quick\"},\"useNormalizedEsInterval\":true,\"interval\":\"auto\",\"time_zone\":\"America/Los_Angeles\",\"drop_partials\":false,\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Date\"}}]}", + "uiStateJSON": "{}", + "description": "", + "version": 1, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"2614d680-f81d-11e8-9bed-e1397b7d7416\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "0f34ec00-f7e8-11e8-9315-e546074942c0", + "_type": "visualization", + "_source": { + "title": "Network Traffic - Outbound", + "visState": "{\"title\":\"Network Traffic - Outbound\",\"type\":\"line\",\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"KB/s\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"KB/s\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"lineWidth\":4}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"network_tx\",\"customLabel\":\"KB/s\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now-15m\",\"to\":\"now\",\"mode\":\"quick\"},\"useNormalizedEsInterval\":true,\"interval\":\"auto\",\"time_zone\":\"America/Los_Angeles\",\"drop_partials\":false,\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"node\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}]}", + "uiStateJSON": "{}", + "description": "", + "version": 1, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"2614d680-f81d-11e8-9bed-e1397b7d7416\",\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[]}" + } + }, + "_meta": { + "savedObjectVersion": 2 + } + }, + { + "_id": "ea8cdbc0-f81d-11e8-9bed-e1397b7d7416", + "_type": "index-pattern", + "_source": { + "title": "picluster-logging", + "timeFieldName": "date", + "fields": "[{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"data\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"date\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]" + }, + "_meta": { + "savedObjectVersion": 2 + }, + "_migrationVersion": { + "index-pattern": "6.5.0" + } + } +] \ No newline at end of file diff --git a/launch.json b/launch.json new file mode 100644 index 0000000..e8fc564 --- /dev/null +++ b/launch.json @@ -0,0 +1,57 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Web", + "cwd": "/home/verita84/picluster/web", + "program": "/home/verita84/picluster/web/webconsole.js", + "env": { "PICLUSTER_CONFIG": "/home/verita84/picluster/config.json"}, + "runtimeArgs":["--inspect=0.0.0.0:9003"] + }, + { + "type": "node", + "request": "launch", + "name": "Agent", + "cwd": "/home/verita84/picluster/agent", + "program": "/home/verita84/picluster/agent/agent.js", + "env": { "PICLUSTER_CONFIG": "/home/verita84/picluster/config.json"}, + "runtimeArgs":["--inspect=0.0.0.0:9001"] + }, + { + "type": "node", + "request": "launch", + "name": "Server", + "cwd": "/home/verita84/picluster/server", + "program": "/home/verita84/picluster/server/server.js", + "runtimeArgs":["--inspect=0.0.0.0:9000"] + }, + { + "type": "node", + "request": "attach", + "name": "Debug-Server", + "port": 9000, + "restart": true, + "protocol": "inspector" + }, + { + "type": "node", + "request": "attach", + "name": "Debug-Web", + "port": 9003, + "restart": true, + "protocol": "inspector" + }, { + "type": "node", + "request": "attach", + "name": "Debug-Agent", + "port": 9001, + "restart": true, + "protocol": "inspector" + } + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..47ef869 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5797 @@ +{ + "name": "picluster", + "requires": true, + "lockfileVersion": 1, + "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==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11" + } + }, + "@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==" + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", + "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "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", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "requires": { + "type-fest": "^0.8.1" + } + } + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "@types/node": { + "version": "14.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", + "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "3.10.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "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 + } + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "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" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "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 + } + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "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==" + }, + "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" + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "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==" + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", + "dev": true + }, + "array-includes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.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 + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.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==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buf-compare": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", + "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=", + "dev": true + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "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" + } + } + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "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==", + "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=" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-assert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", + "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=", + "dev": true, + "requires": { + "buf-compare": "^1.0.0", + "is-error": "^2.2.0" + } + }, + "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=", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "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 + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "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=" + }, + "deep-strict-equal": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz", + "integrity": "sha1-SgeBR6irV/ag1PVUckPNIvROtOQ=", + "dev": true, + "requires": { + "core-assert": "^0.2.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "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==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhance-visitors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/enhance-visitors/-/enhance-visitors-1.0.0.tgz", + "integrity": "sha1-qpRdBdpGVnKh69OP7i7T2oUY6Vo=", + "dev": true, + "requires": { + "lodash": "^4.13.1" + } + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "env-editor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.1.tgz", + "integrity": "sha512-suh+Vm00GnPQgXpmONTkcUT9LgBSL6sJrRnJxbykT0j+ONjzmIS+1U3ne467ArdZN/42/npp+GnhtwkLQ+vUjw==", + "dev": true + }, + "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" + } + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "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=" + }, + "eslint": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", + "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.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.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "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": "^4.17.21", + "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" + }, + "dependencies": { + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + }, + "dependencies": { + "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==", + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dev": true, + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "eslint-config-xo": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.30.0.tgz", + "integrity": "sha512-0C+Hl1Mfrbh+LMc2A2v2BabI+n0MoVHYyGJOJoWped/Tfh/OoyZ7gLyed5vLqVR4czjR8Zi7DGW2S1nTGKUY4w==", + "dev": true, + "requires": { + "confusing-browser-globals": "1.0.9" + } + }, + "eslint-config-xo-typescript": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.31.0.tgz", + "integrity": "sha512-zxfUdKscsdrZTI5Uz9ZqAAR+W6fuH+DiQnTRRJAwLZaKJemT3hzH0DtIxNhB9t5fxKMwZYNYw2lvW4aWrSMbag==", + "dev": true + }, + "eslint-formatter-pretty": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-3.0.1.tgz", + "integrity": "sha512-hhQ/ASD4i6BAEalcEfUxesFtJFftT8xFsimCzUpPbTzygJ4J17yCGcJ3XKCB2g7XTJTv0pi7rVTadfHVmtfSRA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "eslint-rule-docs": "^1.1.5", + "log-symbols": "^3.0.0", + "plur": "^3.0.1", + "string-width": "^4.2.0", + "supports-hyperlinks": "^2.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" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-import-resolver-webpack": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz", + "integrity": "sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ==", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^2.6.9", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "has": "^1.0.3", + "interpret": "^1.2.0", + "lodash": "^4.17.15", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.13.1", + "semver": "^5.7.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-ava": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-10.5.0.tgz", + "integrity": "sha512-2I0Ze8ZtwbSlLdnzms4bsa6PxxOxGMIJ9d4yy7aRy3yc5zEO2wHJLic8l3Lrct73hb5ML+PLt5VRqvdV87xWdQ==", + "dev": true, + "requires": { + "deep-strict-equal": "^0.2.0", + "enhance-visitors": "^1.0.0", + "espree": "^7.1.0", + "espurify": "^2.0.1", + "import-modules": "^2.0.0", + "micro-spelling-correcter": "^1.1.1", + "pkg-dir": "^4.2.0", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-eslint-comments": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-no-use-extend-native": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.5.0.tgz", + "integrity": "sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==", + "dev": true, + "requires": { + "is-get-set-prop": "^1.0.0", + "is-js-type": "^2.0.0", + "is-obj-prop": "^1.0.0", + "is-proto-prop": "^2.0.0" + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz", + "integrity": "sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true + }, + "eslint-plugin-unicorn": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-20.1.0.tgz", + "integrity": "sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA==", + "dev": true, + "requires": { + "ci-info": "^2.0.0", + "clean-regexp": "^1.0.0", + "eslint-ast-utils": "^1.1.0", + "eslint-template-visitor": "^2.0.0", + "eslint-utils": "^2.0.0", + "import-modules": "^2.0.0", + "lodash": "^4.17.15", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.21", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^7.3.2" + }, + "dependencies": { + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + } + } + }, + "eslint-rule-docs": { + "version": "1.1.217", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.217.tgz", + "integrity": "sha512-xqd9Dtrr0bwoMtcQniZ+V/oXmixPe8TbPcKbMy4tzKIljUhiUpQDYrDZ6H3fIqUBlCcl9r7UhLoERqsMA74bcg==", + "dev": true + }, + "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==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-template-visitor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.2.1.tgz", + "integrity": "sha512-q3SxoBXz0XjPGkUpwGVAwIwIPIxzCAJX1uwfVc8tW3v7u/zS7WXNH3I2Mu2MDz2NgSITAyKLRaQFPHu/iyKxDQ==", + "dev": true, + "requires": { + "babel-eslint": "^10.1.0", + "eslint-visitor-keys": "^1.3.0", + "esquery": "^1.3.1", + "multimap": "^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-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "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==" + } + } + }, + "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==" + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "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==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "espurify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.0.1.tgz", + "integrity": "sha512-7w/dUrReI/QbJFHRwfomTlkQOXaB1NuCrBRn5Y26HXn5gvh18/19AgLbayVrNxXQfkckvgrJloWyvZDuJ7dhEA==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "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==", + "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==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "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=" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "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==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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=" + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-set-props": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.1.0.tgz", + "integrity": "sha1-mYR1wXhEVobQsyJG2l3428++jqM=", + "dev": true + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "requires": { + "ini": "1.3.7" + } + }, + "globals": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "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-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", + "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "irregular-plurals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^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-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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==" + }, + "is-get-set-prop": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz", + "integrity": "sha1-JzGHfk14pqae3M5rudaLB3nnYxI=", + "dev": true, + "requires": { + "get-set-props": "^0.1.0", + "lowercase-keys": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-js-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-2.0.0.tgz", + "integrity": "sha1-c2FwBtZZtOtHKbunR9KHgt8PfiI=", + "dev": true, + "requires": { + "js-types": "^1.0.0" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-obj-prop": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-1.0.0.tgz", + "integrity": "sha1-s03nnEULjXxzqyzfZ9yHWtuF+A4=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0", + "obj-props": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-proto-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-2.0.0.tgz", + "integrity": "sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0", + "proto-props": "^2.0.0" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/js-types/-/js-types-1.0.0.tgz", + "integrity": "sha1-0kLmSU7Vcq08koCfyL7X92h8vwM=", + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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=" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.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==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "line-column-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/line-column-path/-/line-column-path-2.0.0.tgz", + "integrity": "sha512-nz3A+vi4bElhwd62E9+Qk/f9BDYLSzD/4Hy1rir0I4GnMxSTezSymzANyph5N1PgRZ3sSbA+yR5hOuXxc71a0Q==", + "dev": true, + "requires": { + "type-fest": "^0.4.1" + }, + "dependencies": { + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true + } + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + }, + "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" + } + } + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + }, + "meow": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "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 + } + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.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 + }, + "micro-spelling-correcter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/micro-spelling-correcter/-/micro-spelling-correcter-1.1.1.tgz", + "integrity": "sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==", + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "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-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "obj-props": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/obj-props/-/obj-props-1.3.0.tgz", + "integrity": "sha512-k2Xkjx5wn6eC3537SWAXHzB6lkI81kS+icMKMkh4nG3w7shWG6MaWOBrNvhWVOszrtL5uxdfymQQfPUxwY+2eg==", + "dev": true + }, + "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 + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "open-editor": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/open-editor/-/open-editor-2.0.1.tgz", + "integrity": "sha512-B3KdD7Pl8jYdpBSBBbdYaqVUI3whQjLl1G1+CvhNc8+d7GzKRUq+VuCIx1thxGiqD2oBGRvsZz7QWrBsFP2yVA==", + "dev": true, + "requires": { + "env-editor": "^0.4.0", + "line-column-path": "^2.0.0", + "open": "^6.2.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "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" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "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 + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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 + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "plur": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", + "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "dev": true, + "requires": { + "irregular-plurals": "^2.0.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "prettier": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz", + "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proto-props": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proto-props/-/proto-props-2.0.0.tgz", + "integrity": "sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "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 + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, + "regexp-tree": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.21.tgz", + "integrity": "sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw==", + "dev": true + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "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==" + }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "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==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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==", + "dev": true + }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==", + "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==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "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==", + "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==", + "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==" + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "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 + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "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==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "table": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", + "integrity": "sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ==", + "requires": { + "ajv": "^8.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", + "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", + "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==" + } + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "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=" + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "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==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.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" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "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" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.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==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "xo": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/xo/-/xo-0.32.1.tgz", + "integrity": "sha512-L43ROY2opNW7yp7byEAibBSk0jYvMuC4yUUrphkqegqU76Bxp5Rc+Gcl62lK1f5zuRrlY0IwMypIfY4EPSzMfQ==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^3.1.0", + "@typescript-eslint/parser": "^3.1.0", + "arrify": "^2.0.1", + "cosmiconfig": "^6.0.0", + "debug": "^4.1.1", + "eslint": "^7.1.0", + "eslint-config-prettier": "^6.11.0", + "eslint-config-xo": "^0.30.0", + "eslint-config-xo-typescript": "^0.31.0", + "eslint-formatter-pretty": "^3.0.1", + "eslint-import-resolver-webpack": "^0.12.1", + "eslint-plugin-ava": "^10.3.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-no-use-extend-native": "^0.5.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^3.1.3", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-unicorn": "^20.1.0", + "find-cache-dir": "^3.3.1", + "find-up": "^4.1.0", + "fs-extra": "^9.0.0", + "get-stdin": "^8.0.0", + "globby": "^9.0.0", + "has-flag": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-path-inside": "^3.0.2", + "json-stable-stringify-without-jsonify": "^1.0.1", + "json5": "^2.1.3", + "lodash": "^4.17.15", + "meow": "^7.0.1", + "micromatch": "^4.0.2", + "open-editor": "^2.0.1", + "p-reduce": "^2.1.0", + "path-exists": "^4.0.0", + "prettier": "2.0.4", + "resolve-cwd": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "slash": "^3.0.0", + "to-absolute-glob": "^2.0.2", + "typescript": "^3.3.1", + "update-notifier": "^4.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b4770f6 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "picluster", + "config": { + "unsafe-perm": true + }, + "scripts": { + "test": "xo", + "install": "cd server && npm install && cd ../agent && npm install && cd ../web && npm install && cd .." + }, + "repository": { + "type": "git", + "url": "git+https://git.rage.lol/verita84/picluster/picluster.git" + }, + "keywords": [], + "author": "", + "license": "GPL-3.0", + "bugs": { + "url": "https://git.rage.lol/verita84/picluster/picluster/issues" + }, + "homepage": "https://git.rage.lol/verita84/picluster/picluster", + "xo": { + "space": 2, + "envs": [ + "node", + "es6" + ], + "ignores": [ + "web/assets/**" + ], + "rules": { + "camelcase": "off", + "no-prototype-builtins": "off", + "radix": "off", + "max-nested-callbacks": "warn", + "no-path-concat": "warn" + } + }, + "devDependencies": { + "xo": "^0.32.1" + }, + "dependencies": { + "eslint": "^7.24.0", + "yargs-parser": "^20.2.7" + } +} diff --git a/picluster-pm2.config-example.json b/picluster-pm2.config-example.json new file mode 100644 index 0000000..9532aac --- /dev/null +++ b/picluster-pm2.config-example.json @@ -0,0 +1,29 @@ +{ + "apps": [ + { + "name" : "server", + "script" : "server.js", + "cwd" : "/picluster/server", + "watch" : true, + "env": { + "PICLUSTER_CONFIG": "/picluster/config.json" + } + },{ + "name" : "agent", + "script" : "agent.js", + "cwd" : "/picluster/agent", + "watch" : true, + "env": { + "PICLUSTER_CONFIG": "/picluster/config.json" + } + },{ + "name" : "webconsole", + "script" : "webconsole.js", + "cwd" : "/picluster/web", + "watch" : true, + "env": { + "PICLUSTER_CONFIG": "/picluster/config.json" + } + } + ] +} diff --git a/picluster-pm2.config.json b/picluster-pm2.config.json new file mode 100755 index 0000000..e69de29 diff --git a/pictl b/pictl new file mode 100755 index 0000000..fe33c97 --- /dev/null +++ b/pictl @@ -0,0 +1,177 @@ +#!/usr/bin/env bash +clear + +# Test if jq is installed +if type jq &>/dev/null; then + # Config file + config="config.json" + + # Set config parameters to assign to variables + config_token=$(jq .token $config | sed -e 's/\"//g') + config_server_port=$(jq .server_port $config | sed -e 's/\"//g') + config_ssl=$(jq .ssl $config | sed -e 's/\"//g') + config_web_connect=$(jq .web_connect $config | sed -e 's/\"//g') + + hb(){ + clear + echo "Heartbeat is now checking....." + if [ "${config_ssl}" == "true" ]; then curl -s "https://${config_web_connect}:${config_server_port}/hb?token=${config_token}" + else curl -s "http://${config_web_connect}:${config_server_port}/hb?token=${config_token}" + fi + logs + } + + nodes(){ + clear + echo "Active Nodes:" + if [ "${config_ssl}" == "true" ]; then echo;curl -s "https://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq -r '.data[] | "\(.hostname)"';echo + else echo;curl -s "http://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq -r '.data[] | "\(.hostname)"';echo + fi + } + + metrics(){ + clear + echo "Nodes Metrics" + if [ "${config_ssl}" == "true" ]; then echo;curl -s "https://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq -r '.data[] | "\(.hostname) CPU: \(.cpu_percent) Memory: \(.memory_percentage) Disk: \(.disk_percentage) Running: \(.total_running_containers) "' + else echo;curl -s "http://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq -r '.data[] | "\(.hostname) CPU: \(.cpu_percent) Memory: \(.memory_percentage) Disk: \(.disk_percentage) Running: \(.total_running_containers) Network In : \(.network_rx) Network Out : \(.network_tx)"';echo + fi + } + + stop(){ + clear + echo "Stopping the container(s)....." + if [ "${config_ssl}" == "true" ]; then curl -s -G -d "token=${config_token}&container=$1&operation=stop" "https://${config_web_connect}:${config_server_port}/manage" + else curl -s -G -d "token=${config_token}&container=$1&operation=stop" "http://${config_web_connect}:${config_server_port}/manage" + fi + } + + images(){ + clear + echo "Gathering a list of images....." + if [ "${config_ssl}" == "true" ]; then curl -s "https://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq -r '.data[] | "\(.hostname) \(.images)"' + else curl -s "http://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq -r '.data[] | "\(.hostname) \(.images)"' + fi + } + + addimage(){ + clear + if [ "${config_ssl}" == "true" ]; then + echo "Uploading container zip file to Server......." + curl -X POST -F "file=@$1" -F "token=${config_token}" "https://${config_web_connect}:${config_server_port}/receive-file" + echo + else + echo "Uploading container Zip file to Server......." + curl -X POST -F "file=@$1" -F "token=${config_token}" "http://${config_web_connect}:${config_server_port}/receive-file" + echo + fi + } + + shell(){ + clear + echo "Running the command....." + if [ "${config_ssl}" == "true" ]; then curl -H "Content-Type: application/json" -X POST -d '{"command":"'"$1"'","token":"'"${config_token}"'"}' "https://${config_web_connect}:${config_server_port}/exec" + else curl -H "Content-Type: application/json" -X POST -d '{"command":"'"$1"'","token":"'"${config_token}"'"}' "http://${config_web_connect}:${config_server_port}/exec" + fi + } + + clean(){ + clear + echo "Cleaning stale Docker images and containers...." + if [ "${config_ssl}" == "true" ]; then curl -s "https://${config_web_connect}:${config_server_port}/prune?token=${config_token}" + else curl -H "Content-Type: application/json" -X POST -d '{"token":"'"${config_token}"'"}' "http://${config_web_connect}:${config_server_port}/prune" + fi + } + + build() { + clear + echo "Building the container(s). This may take a while......" + if [ "${config_ssl}" == "true" ]; then curl -s -G -d "token=${config_token}&container=$1&no_cache=1&operation=build" "https://${config_web_connect}:${config_server_port}/manage-image" + else curl -s -G -d "token=${config_token}&container=$1&no_cache=1&operation=build" "http://${config_web_connect}:${config_server_port}/manage-image" + fi + } + + logs(){ + sleep 5 + clear + echo "Checking the logs....." + if [ "${config_ssl}" == "true" ]; then curl -s "https://${config_web_connect}:${config_server_port}/log?token=${config_token}" + else curl -s "http://${config_web_connect}:${config_server_port}/log?token=${config_token}" + fi + } + + create() { + clear + echo "Running the container(s)....." + if [ "${config_ssl}" == "true" ]; then curl -s -G -d "token=${config_token}&container=$1&operation=create" "https://${config_web_connect}:${config_server_port}/manage" + else curl -s -G -d "token=${config_token}&container=$1&operation=create" "http://${config_web_connect}:${config_server_port}/manage" + fi + } + + start(){ + clear + echo "Starting the container(s)....." + if [ "${config_ssl}" == "true" ]; then curl -s -G -d "token=${config_token}&container=$1&operation=start" "https://${config_web_connect}:${config_server_port}/manage" + else curl -s -G -d "token=${config_token}&container=$1&operation=start" "http://${config_web_connect}:${config_server_port}/manage" + fi + } + + restart(){ + clear + echo "Restarting the container(s)....." + if [ "${config_ssl}" == "true" ]; then curl -s -G -d "token=${config_token}&container=$1&operation=restart" "https://${config_web_connect}:${config_server_port}/manage" + else curl -s -G -d "token=${config_token}&container=$1&operation=restart" "http://${config_web_connect}:${config_server_port}/manage" + fi + } + + changehost(){ + clear + echo "Changing the host....." + if [ "${config_ssl}" == "true" ]; then curl -s -G -d "token=${config_token}&newhost=$2&container=$1" "https://${config_web_connect}:${config_server_port}/changehost" + else curl -s -G -d "token=${config_token}&newhost=$2&container=$1" "http://${config_web_connect}:${config_server_port}/changehost" + fi + } + + delete(){ + clear + echo "Deleting the container(s)....." + if [ "${config_ssl}" == "true" ]; then curl -s -G -d "token=${config_token}&container=$1&operation=rm" "https://${config_web_connect}:${config_server_port}/manage" + else curl -s -G -d "token=${config_token}&container=$1&operation=rm" "http://${config_web_connect}:${config_server_port}/manage" + fi + } + + status() { + clear + echo "Checking the status....." + if [ "${config_ssl}" == "true" ]; then curl -s "http://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq ".data[].running_containers" + else curl -s "http://${config_web_connect}:${config_server_port}/nodes?token=${config_token}" | jq -r '.data[] | "\(.hostname) \(.running_containers)"' + fi + } + + if [ -z "$1" ]; then + echo "Error, no args specified!" + echo + arguments="build metrics addimage nodes images start create status exec start stop clean " + echo "Valid arguments are: $arguments" + echo + exit + fi; + + if [ "$1" = "hb" ]; then hb;exit; fi; + if [ "$1" = "exec" ]; then shell "$2";exit; fi; + if [ "$1" = "metrics" ]; then metrics "$2";exit; fi; + if [ "$1" = "status" ]; then echo "Gathering Cluster Status....";status;exit; fi; + if [ "$1" = "nodes" ]; then nodes;exit; fi; + if [ "$1" = "addimage" ]; then addimage "$2";exit; fi; + if [ "$1" = "clean" ]; then clean;exit; fi; + if [ "$1" = "images" ]; then images;exit; fi; + if [ "$1" = "log" ]; then echo "Gathering Logs....";logs;exit; fi; + if [ "$1" = "restart" ]; then restart "$2";exit; fi; + if [ "$1" = "changehost" ]; then changehost "$2" "$3";exit; fi; + if [ "$1" = "delete" ]; then delete "$2";exit; fi; + if [ "$1" = "build" ]; then echo "Building Images....";build "$2"; fi; + if [ "$1" = "start" ]; then echo "Running container(s)....";start "$2"; fi; + if [ "$1" = "stop" ]; then echo "Stopping container(s)....";stop "$2"; fi; + if [ "$1" = "create" ]; then echo "Creating container(s)....";create "$2"; fi; +else + echo "Please install jq" +fi diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..0778df7 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,1576 @@ +{ + "name": "picluster-server", + "version": "0.0.1", + "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==", + "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==" + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "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", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "requires": { + "type-fest": "^0.8.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "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==" + }, + "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" + } + }, + "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==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "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" + } + } + } + }, + "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==", + "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=" + }, + "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" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "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=" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "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=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "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==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=" + }, + "eslint": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", + "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.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.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "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": "^4.17.21", + "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" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "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==", + "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==", + "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==" + } + } + }, + "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==" + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "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==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "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==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "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==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "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-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=" + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "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==" + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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=" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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==" + }, + "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==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "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=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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=" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "line-reader": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz", + "integrity": "sha1-F+RIGNoKwzVnW6MAlU+U72cOZv0=" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "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.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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" + } + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "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" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + }, + "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==" + }, + "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==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "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==", + "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==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "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==", + "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==" + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "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-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==" + }, + "superagent": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "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" + } + }, + "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==" + }, + "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" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "sys": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/sys/-/sys-0.0.1.tgz", + "integrity": "sha1-NIDMaVcUkFt6vOUKVaWjmFmX5hk=" + }, + "table": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", + "integrity": "sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ==", + "requires": { + "ajv": "^8.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", + "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", + "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==" + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "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==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "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" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..771db7b --- /dev/null +++ b/server/package.json @@ -0,0 +1,21 @@ +{ + "name": "picluster-server", + "version": "0.0.1", + "config": { + "unsafe-perm": true + }, + "dependencies": { + "async": "latest", + "body-parser": "latest", + "eslint": "^7.24.0", + "express": "", + "fs": "0.0.2", + "line-reader": "", + "lodash": "^4.17.21", + "moment": "", + "multer": "latest", + "superagent": "^5.3.1", + "sys": "", + "uuid": "^8.3.2" + } +} diff --git a/server/picluster.conf b/server/picluster.conf new file mode 100644 index 0000000..eb67846 --- /dev/null +++ b/server/picluster.conf @@ -0,0 +1,3 @@ +stream { + + } \ No newline at end of file diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..ca387c7 --- /dev/null +++ b/server/server.js @@ -0,0 +1,2145 @@ +const http = require('http'); +const https = require('https'); +const fs = require('fs'); +const net = require('net'); +const tls = require('tls'); +const multer = require('multer'); +const express = require('express'); +const Moment = require('moment'); +const async = require('async'); +const superagent = require('superagent'); +const bodyParser = require('body-parser'); +const { + forOwn +} = require('lodash'); +const { + parse +} = require('path'); +const { + exec +} = require('child_process'); +const version = "3.0.11" + +const bootstrap = { + status: 1 +}; +const functions = { + name: [] +}; +let total_nodes = 0; +let config; +let config_file; +if (process.env.PICLUSTER_CONFIG) { + config = JSON.parse(fs.readFileSync(process.env.PICLUSTER_CONFIG, 'utf8')); + config_file = process.env.PICLUSTER_CONFIG; +} else { + config = JSON.parse(fs.readFileSync('../config.json', 'utf8')); + config_file = '../config.json'; +} + +if (config.ssl_self_signed) { + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; +} + +const app = express(); +app.use(express.json({ + limit: '20mb' +})); + +const upload = multer({ + dest: '../' +}); +const scheme = config.ssl ? 'https://' : 'http://'; +const ssl_self_signed = config.ssl_self_signed === false; +const server = config.web_connect; +let { + rsyslog_host +} = config; +const { + server_port +} = config; +const { + agent_port +} = config; +let log = ''; +let { + token +} = config; +let dockerFolder = config.docker; +const container_faillog = []; +const picluster_release = '2.6'; + +if (config.loadbalancer) { + configure_loadbalancer(); +} + +if (config.elasticsearch) { + const mapping = { + settings: { + index: { + number_of_shards: 3, + number_of_replicas: 2 + } + }, + mappings: { + 'picluster-logging': { + properties: { + date: { + type: 'date', + index: 'true', + }, + data: { + type: 'keyword', + index: 'true' + } + } + } + } + }; + + const monitoring_mapping = { + settings: { + index: { + number_of_shards: 3, + number_of_replicas: 2 + } + }, + mappings: { + 'picluster-monitoring': { + properties: { + date: { + type: 'date', + index: 'true' + }, + cpu: { + type: 'double', + index: 'true' + }, + node: { + type: 'text', + index: 'true' + }, + memory: { + type: 'double', + index: 'true' + }, + network_tx: { + type: 'double', + index: 'true' + }, + network_rx: { + type: 'double', + index: 'true' + }, + disk: { + type: 'double', + index: 'true' + }, + total_running_containers: { + type: 'double', + index: 'true' + } + } + } + } + }; + + create_es_mappings(mapping, 'picluster-logging'); + create_es_mappings(monitoring_mapping, 'picluster-monitoring'); +} + +//templates +/** +superagent +.get(`${scheme}${node}:${agent_port}/node-status`) +.query({ token: token }) +.end((error, response) => { +}); + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ token: token, payload }) + .set('accept', 'json') + .end((error, response) => { + }); + +*/ +function create_es_mappings(mapping, index) { + superagent + .put(config.elasticsearch + '/' + index) + .send(mapping) + .set('accept', 'json') + // .set('Authorization', 'ApiKey Ui1YYTFYb0JvcUN3M1lvSlBvX0E6Rl9PamI2aU1RM1NvV2xwTHQ0bFpuQQ') + .end((error, response) => { + console.log('\nCreating Elasticsearch Map......'); + if (error) { + console.log(error); + } else { + console.log(response.text); + } + }); +} + +if (config.automatic_heartbeat) { + if (config.automatic_heartbeat.indexOf('enabled') > -1) { + if (config.heartbeat_interval) { + console.log('\nAutomatic Heartbeat Enabled. Will check every: ' + config.heartbeat_interval + ' ms.'); + automatic_heartbeat(); + } else { + console.log('\nAutomatic Heartbeat Disabled: heartbeat_interval is not set.'); + } + } else { + console.log('\nAutomatic Heartbeat Disabled.'); + } +} else { + console.log('\nAutomatic Heartbeat Disabled.'); +} + +function automatic_heartbeat() { + if (config.automatic_heartbeat.indexOf('enabled') > -1) { + setTimeout(() => { + superagent + .get(`${scheme}${server}:${server_port}/hb`) + .query({ + token: token + }) + .end((error, response) => { + if (error) { + console.log(error); + } + }); + automatic_heartbeat(); + }, config.heartbeat_interval); + } else { + console.log('\nAutomatic Heartbeat Disabled.'); + } +} + +app.get('/clear-functions', (req, res) => { + const check_token = req.query.token; + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + Object.keys(functions.name).forEach((get_name, i) => { + delete_function(functions.name[i].name, functions.name[i].host); + remove_function_data(functions.name[i].uuid); + }); + res.end('Sent request to remove stale functions.'); + } +}); + +app.post('/bootstrap', (req, res) => { + const check_token = req.body.token; + const { + host + } = req.body; + let statusCode = 0; + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials or missing parameters.'); + } else { + if (bootstrap.status === 1) { + let proceed = 1; + + Object.keys(config.layout).forEach((get_node, i) => { + if (config.layout[i].node.indexOf(host) > -1) { + proceed = 0; + } + }); + + if (proceed) { + config.layout.push({ + node: host + }); + + config.hb.push({ + node: host + }); + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end('An error occurred: ' + error); + } else { + bootstrap.status = 1; + console.log('\nAdded node: ' + host + ' to the cluster.'); + statusCode = 1; + } + }); + } else { + bootstrap.status = 1; + console.log('\nnode: ' + host + ' is already part of the cluster.'); + statusCode = 2; + } + } else { + console.log('\nAnother bootstrap process is already running. Please try again later.'); + statusCode = 0; + } + res.end(JSON.stringify({ + output: statusCode + })); + } +}); + +app.post('/function', (req, res) => { + const check_token = req.body.token; + const { + output + } = req.body; + const { + uuid + } = req.body; + + if ((check_token !== token) || (!check_token) || (!uuid)) { + res.end('\nError: Invalid Credentials or missing parameters.'); + } else { + Object.keys(functions.name).forEach((get_name, i) => { + if (functions.name[i].uuid.toString().indexOf(uuid.toString()) > -1) { + functions.name[i].output = output; + delete_function(functions.name[i].name, functions.name[i].host); + res.end(''); + } + }); + } +}); + +app.get('/function', (req, res) => { + const check_token = req.query.token; + const name = req.query.function; + const min = 1; + const max = 9999999; + const uuid = Math.floor(Math.random() * (max - min + 1)) + min; + const min_node = 0; + const max_node = total_nodes - 1; + const node_number = Math.floor(Math.random() * (max_node - min_node + 1)) + min_node; + const host = config.layout[node_number].node; + const { + container_args + } = req.query; + + const function_data = { + uuid, + name: name + '-' + uuid, + output: '', + host + }; + + if ((check_token !== token) || (!check_token) || (!name)) { + res.end('\nError: Invalid Credentials or parameters.'); + } else { + functions.name.push(function_data); + create_function(name + '-' + uuid, uuid, host, container_args); + res.end(scheme + server + ':' + server_port + '/getfunction?token=' + token + '&uuid=' + uuid); + } +}); + +function remove_function_data(uuid) { + Object.keys(functions.name).forEach((get_name, i) => { + if (functions.name[i].uuid.toString().indexOf(uuid.toString()) > -1) { + functions.name[i].name = ''; + functions.name[i].output = ''; + functions.name[i].uuid = ''; + functions.name[i].host = ''; + } + }); +} + +app.get('/getfunction', (req, res) => { + const check_token = req.query.token; + const { + uuid + } = req.query; + let output = ''; + + if ((check_token !== token) || (!check_token) || (!uuid)) { + res.end('\nError: Invalid Credentials or parameters.'); + } else { + Object.keys(functions.name).forEach((get_name, i) => { + if ((functions.name[i].uuid.toString().indexOf(uuid.toString()) > -1 && functions.name[i].output.length > 1)) { + output = functions.name[i].output; + remove_function_data(uuid); + } + }); + res.end(output); + } +}); + +function create_function(name, uuid, host, user_container_args) { + let container_args = '-e UUID=' + uuid + ' -e TOKEN=' + token + ' -e SERVER=' + scheme + server + ':' + server_port; + const container = name; + + if (user_container_args) { + container_args = user_container_args + ' ' + container_args; + } + + migrate(container, host, host, container_args, uuid); +} + +app.get('/clearlog', (req, res) => { + const check_token = req.query.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + log = ''; + res.end(); + } +}); + +app.get('/nodes', (req, res) => { + const node_metrics = { + version, + data: [], + functions, + function_server: `${scheme}${server}:${server_port}/getfunction` + }; + + function addData(data) { + node_metrics.data.push(data); + } + + function getData() { + let total_node_count = 0; + let total_containers = 0; + const node_list = []; + const container_list = []; + + for (let i = 0; i < config.layout.length; i++) { + for (const key in config.layout[i]) { + if (config.layout[i].hasOwnProperty(key)) { + const { + node + } = config.layout[i]; + const node_info = config.layout[i][key]; + if (node_info === node) { + total_node_count++; + node_list.push(node); + } else { + total_containers++; + container_list.push(key); + } + } + } + } + + node_metrics.total_containers = total_containers; + node_metrics.total_nodes = total_node_count; + node_metrics.container_list = container_list; + node_metrics.nodes = node_list; + total_nodes = total_node_count; + return node_metrics; + } + + const check_token = req.query.token; + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + config.layout.forEach(get_node => { + const { + node + } = get_node; + + if (!node) { + console.error('Invalid Config for node', get_node); + return; + } + + superagent + .get(`${scheme}${node}:${agent_port}/node-status`) + .query({ + token: token + }) + .end((error, response) => { + if (error) { + console.error(error); + } else { + try { + const check = JSON.parse(response.text); + if (check.cpu_percent > 0) { + addData(check); + if (config.elasticsearch) { + elasticsearch_monitoring(check.cpu_percent / check.cpu_cores, check.hostname, check.disk_percentage, check.memory_percentage, check.total_running_containers, check.network_rx, check.network_tx); + } + } + } catch (error2) { + console.log('\nError gathering monitoring metrics: Invalid JSON or Credentials!' + error2); + } + } + }); + }); + setTimeout(() => { + res.json(getData()); + }, 3000); + } +}); + +function addLog(data) { + log += data; + if (config.elasticsearch) { + elasticsearch(JSON.stringify(log)); + } +} + +app.get('/', (req, res) => { + res.end('PiCluster Server v' + picluster_release); +}); + +app.get('/manage-image', (req, res) => { + const check_token = req.query.token; + const { + operation + } = req.query; + let docker_command = ''; + let container = ''; + let command_log = ''; + const url = []; + const what = []; + const { + no_cache + } = req.query; + + if (req.query.container) { + container = req.query.container; + } + + if (container.indexOf('*') > -1 || container.length === 0) { + container = '*'; + } + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + Object.keys(config.layout).forEach((get_node, i) => { + Object.keys(config.layout[i]).forEach(key => { + const { + node + } = config.layout[i]; + + if ((!config.layout[i].hasOwnProperty(key) || key.indexOf('node') > -1)) { + return; + } + const make_url = `${scheme}${node}:${agent_port}/run`; + if (container.indexOf('*') > -1 || container.indexOf(key) > -1) { + what.push(key); + url.push(make_url); + } + }); + }); + + let i = 0; + + async.eachSeries(url, (url, cb) => { + if (operation === 'rm') { + docker_command = 'docker image rm ' + what[i]; + } + + if (operation === 'build' && no_cache === '1') { + docker_command = 'docker image build --no-cache ' + dockerFolder + '/' + what[i] + ' -t ' + what[i] + ' -f ' + dockerFolder + '/' + what[i] + '/Dockerfile'; + } + + if (operation === 'build' && no_cache === '0') { + docker_command = 'docker image build ' + dockerFolder + '/' + what[i] + ' -t ' + what[i] + ' -f ' + dockerFolder + '/' + what[i] + '/Dockerfile'; + } + + superagent + .post(url) + .send({ + token: token, + command: docker_command + }) + .set('accept', 'json') + .end((error, response) => { + try { + const data = JSON.parse(response.text); + command_log += 'Node: ' + data.node + '\n\n' + data.output + '\n\n'; + cb(error); + } catch (error) { + console.log(error); + } + }); + i++; + }, err => { + if (err) { + console.log('\nError: ' + err); + } + res.end(command_log); + }); + } +}); + +app.get('/manage', (req, res) => { + const check_token = req.query.token; + const { + operation + } = req.query; + let docker_command = ''; + let command_log = ''; + let container = ''; + const url = []; + const what = []; + const args = []; + + if (req.query.container) { + container = req.query.container; + } + + if (operation === 'start') { + docker_command = 'docker container start'; + } + if (operation === 'stop') { + docker_command = 'docker container stop'; + } + if (operation === 'rm') { + docker_command = 'docker container rm -f'; + } + if (operation === 'restart') { + docker_command = 'docker container restart'; + } + if (operation === 'logs') { + docker_command = 'docker container logs'; + } + if (operation === 'create') { + docker_command = 'docker container run -d --name '; + } + if (operation === 'commit' && req.query.container) { + docker_command = 'su root -s /bin/bash -lc "docker commit $(docker ps | grep -i ' + req.query.container + ' | cut -d \" \" -f1 | tail -1) ' + req.query.container + "\""; + } + + if (container.indexOf('*') > -1 || container.length === 0) { + container = '*'; + } + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + Object.keys(config.layout).forEach((get_node, i) => { + Object.keys(config.layout[i]).forEach(key => { + const { + node + } = config.layout[i]; + + if ((!config.layout[i].hasOwnProperty(key) || key.indexOf('node') > -1)) { + return; + } + const make_url = `${scheme}${node}:${agent_port}/run`; + if (container.indexOf('*') > -1 || container.indexOf(key) > -1) { + what.push(key); + url.push(make_url); + args.push(config.layout[i][key]); + } + }); + }); + + let i = 0; + + async.eachSeries(url, (url, cb) => { + let command; + if (operation === 'create') { + command = docker_command + what[i] + ' ' + args[i] + ' ' + what[i]; + } else { + command = docker_command + ' ' + what[i]; + } + + superagent + .post(url) + .send({ + token: token, + command: command + }) + .set('accept', 'json') + .end((error, response) => { + try { + const data = JSON.parse(response.text); + command_log += 'Node: ' + data.node + '\n\n' + data.output + '\n\n'; + cb(error); + } catch (error) { + console.log(error); + } + }); + i++; + }, err => { + if (err) { + console.log('\nError: ' + err); + } + res.end(command_log); + }); + } +}); + +function migrate(container, original_host, new_host, original_container_data, uuid) { + let existing_automatic_heartbeat_value = ''; + + if (config.automatic_heartbeat) { + existing_automatic_heartbeat_value = config.automatic_heartbeat; + if (config.automatic_heartbeat.indexOf('enabled') > -1) { + config.automatic_heartbeat = 'disabled'; + } + } + + superagent + .post(`${scheme}${original_host}:${agent_port}/run`) + .send({ + token: token, + command: 'docker container rm -f ' + container + }) + .set('accept', 'json') + .end((error, response) => { + try { + let command = ''; + if (uuid) { + const image_name = container.split('-' + uuid)[0]; + command = 'docker image build ' + dockerFolder + '/' + image_name + ' -t ' + image_name + ' -f ' + dockerFolder + '/' + image_name + '/Dockerfile;docker container run -d --name ' + container + ' ' + original_container_data + ' ' + image_name; + } else { + command = 'docker image build ' + dockerFolder + '/' + container + ' -t ' + container + ' -f ' + dockerFolder + '/' + container + '/Dockerfile;docker container run -d --name ' + container + ' ' + original_container_data + ' ' + container; + } + + superagent + .post(`${scheme}${new_host}:${agent_port}/run`) + .send({ + token: token, + command: command + }) + .set('accept', 'json') + .end((second_error, second_response) => { + try { + if (config.automatic_heartbeat) { + if (existing_automatic_heartbeat_value.indexOf('enabled') > -1) { + config.automatic_heartbeat = existing_automatic_heartbeat_value; + } + } + } catch (second_error) { + addLog('An error has occurred'); + console.log('\nError with migration: ' + second_error); + } + + }); + } catch (error) { + addLog('An error has occurred with migration:'); + console.log(error); + } + + }); +} + +app.get('/addhost', (req, res) => { + const check_token = req.query.token; + const { + host + } = req.query; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + let proceed = 1; + for (let i = 0; i < config.layout.length; i++) { + if (config.layout[i].node.indexOf(host) > -1) { + proceed = 0; + } + } + + if (proceed) { + config.layout.push({ + node: host + }); + + config.hb.push({ + node: host + }); + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end(error); + } else { + res.end('\nAdded host ' + host + ' to the configuration.'); + } + }); + } else { + res.end('\nError: Host already exists'); + } + } +}); + +function elasticsearch_monitoring(cpu, node, disk, memory, total_running_containers, network_rx, network_tx) { + const current_time = new Moment(); + + superagent + .post(config.elasticsearch + '/picluster-monitoring/picluster-monitoring') + .send({ + date: current_time, + cpu, + node, + disk, + memory, + network_rx, + network_tx, + total_running_containers + }) + .set('accept', 'json') + //.set('Authorization', 'ApiKey Ui1YYTFYb0JvcUN3M1lvSlBvX0E6Rl9PamI2aU1RM1NvV2xwTHQ0bFpuQQ') + .end((error, response) => { + if (error) { + console.log(error); + } + }); +} + +function elasticsearch(data) { + const current_time = new Moment(); + + superagent + .post(config.elasticsearch + '/picluster-logging/picluster-logging') + .send({ + date: current_time, + data + }) + .set('accept', 'json') + // .set('Authorization', 'ApiKey Ui1YYTFYb0JvcUN3M1lvSlBvX0E6Rl9PamI2aU1RM1NvV2xwTHQ0bFpuQQ') + .end((error, response) => { + if (error) { + console.log(error); + } + }); +} + +app.get('/rmhost', (req, res) => { + const check_token = req.query.token; + const { + host + } = req.query; + let hb_proceed = 0; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + // Ensures that the host exists + for (let i = 0; i < config.layout.length; i++) { + if (config.layout[i].node.indexOf(host) > -1) { + config.layout.splice(i, 1); + hb_proceed = 1; + break; + } + } + } + + if (hb_proceed) { + if (config.hb) { + for (let i = 0; i < config.hb.length; i++) { + if (config.hb[i].node.indexOf(host) > -1) { + config.hb.splice(i, 1); + break; + } + } + } + } + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end(error); + } else { + res.end('\nRemoved host ' + host + ' from the configuration.'); + } + }); +}); + +app.get('/removecontainerconfig', (req, res) => { + const check_token = req.query.token; + const { + container + } = req.query; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + Object.keys(config.layout).forEach((get_node, i) => { + Object.keys(config.layout[i]).forEach(key => { + if ((!config.layout[i].hasOwnProperty(key) || key.indexOf('node') > -1)) { + return; + } + if (key.indexOf(container) > -1) { + delete config.layout[i][key]; + } + }); + }); + + if (config.hb) { + Object.keys(config.hb).forEach((get_node, i) => { + Object.keys(config.hb[i]).forEach(key => { + if ((!config.hb[i].hasOwnProperty(key) || key.indexOf('node') > -1)) { + return; + } + if (key.indexOf(container) > -1) { + delete config.hb[i][key]; + } + }); + }); + } + + if (config.container_host_constraints) { + Object.keys(config.container_host_constraints).forEach((get_node, i) => { + Object.keys(config.container_host_constraints[i]).forEach(key => { + const analyze = config.container_host_constraints[i][key].split(','); + if (container.indexOf(analyze[0]) > -1) { + config.container_host_constraints.splice(i, i + 1); + } + }); + }); + + for (let i = 0; i < config.container_host_constraints.length; i++) { + for (const key in config.container_host_constraints[i]) { + if (container.length > 0) { + const analyze = config.container_host_constraints[i][key].split(','); + if (container.indexOf(analyze[0]) > -1) { + config.container_host_constraints.splice(i, i + 1); + } + } + } + } + } + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end(error); + } else { + res.end('\nRemoved Container ' + container + ' from the configuration.'); + } + }); + } +}); + +app.get('/addcontainer', (req, res) => { + const check_token = req.query.token; + let { + host + } = req.query; + const { + container + } = req.query; + const { + container_args + } = req.query; + const { + heartbeat_args + } = req.query; + const { + failover_constraints + } = req.query; + + if (host.indexOf('*') > -1) { + const min = 0; + const max = total_nodes - 1; + const number = Math.floor(Math.random() * (max - min + 1)) + min; + host = config.layout[number].node; + } + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + // Ensures that the host exists + let proceed = 0; + + for (let i = 0; i < config.layout.length; i++) { + if (config.layout[i].node.indexOf(host) > -1) { + proceed++; + } + } + + if (proceed < 1) { + res.end('\nError: Node does not exist!'); + } else { + // Add Data to New Host + for (let i = 0; i < config.layout.length; i++) { + if (config.layout[i].node.indexOf(host) > -1) { + config.layout[i][container] = container_args; + } + } + + // Adds Heartbeat Data + if (config.hb) { + if (heartbeat_args) { + for (let i = 0; i < config.hb.length; i++) { + if (config.hb[i].node.indexOf(host) > -1) { + config.hb[i][container] = heartbeat_args; + } + } + } + } + + if (config.container_host_constraints) { + if (failover_constraints) { + config.container_host_constraints.push({ + container: failover_constraints + }); + } + } + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end(error); + } else { + superagent + .get(`${scheme}${server}:${server_port}/changehost`) + .query({ + token: token, + container, + newhost: host, + }) + .end((error, response) => { + if (!error && response.text) { + res.end('\nAdded ' + container + ' to the configuration.'); + } else { + res.end('\nError connecting with server.'); + } + }); + } + }); + } + } +}); + +function configure_loadbalancer() { + let nginx_configuration = 'stream { \n '; + + Object.keys(config.loadbalancer).forEach((get_node, i) => { + Object.keys(config.loadbalancer[i]).forEach(key => { + const parse_data = config.loadbalancer[i][key].split(','); + const container_name = parse_data[0]; + const container_port = parse_data[parse_data.length - 2]; + const service_port = parse_data[parse_data.length - 1]; + const lb_hosts = parse_data.toString().split(','); + nginx_configuration += '\n\n upstream ' + container_name + ' {'; + for (let i = 1; i < lb_hosts.length - 2; i++) { + nginx_configuration += '\nserver ' + lb_hosts[i] + ':' + container_port + ';'; + } + nginx_configuration += '\n } \n\nserver { \n listen ' + ' ' + service_port + '; \n proxy_pass ' + container_name + ';\n }'; + }); + }); + nginx_configuration += '\n }'; + console.log(nginx_configuration); + fs.writeFile('picluster.conf', nginx_configuration, err => { + if (err) { + console.log(err); + } else { + command = 'docker container stop picluster_lb;docker cp picluster.conf picluster_lb:/etc/nginx/conf.d/;docker container restart picluster_lb '; + exec(command, (error, stdout, stderr) => { + if (error) { + console.log(stderr); + } else { + console.log(stdout); + } + }, err => { + if (err) { + console.error('error:', err); + } + }); + } + }); +} + +app.get('/update-container', (req, res) => { + const check_token = req.query.token; + const { + container + } = req.query; + const { + container_args + } = req.query; + const { + heartbeat_args + } = req.query; + const { + failover_constraints + } = req.query; + + if ((check_token !== token) || (!check_token) || container.indexOf('*') > -1) { + res.end('\nError: Invalid Credentials'); + } else { + if (container_args) { + Object.keys(config.layout).forEach((get_node, i) => { + Object.keys(config.layout[i]).forEach(key => { + if (key.indexOf(container) > -1) { + config.layout[i][key] = container_args; + } + }); + }); + } + + if (failover_constraints) { + let proceed = 0; + + Object.keys(config.container_host_constraints).forEach((get_node, i) => { + Object.keys(config.container_host_constraints[i]).forEach(key => { + const get_container_name = failover_constraints.split(','); + const parse_container = get_container_name[0]; + + if (config.container_host_constraints[i][key].indexOf(parse_container) > -1) { + if (failover_constraints.indexOf('none') > -1) { + proceed = 0; + } else { + proceed = 1; + config.container_host_constraints[i][key] = failover_constraints; + } + } + }); + }); + + if (proceed === 0) { + if (failover_constraints.indexOf('none') > -1) { + for (let i = 0; i < config.container_host_constraints.length; i++) { + for (const key in config.container_host_constraints[i]) { + if (container.length > 0) { + const analyze = config.container_host_constraints[i][key].split(','); + if (container.indexOf(analyze[0]) > -1) { + config.container_host_constraints.splice(i, i + 1); + } + } + } + } + } else { + config.container_host_constraints.push({ + container: failover_constraints + }); + } + } + } + + if (heartbeat_args) { + let proceed = 0; + if (config.hb.length === 0) { + for (let i = 0; i < config.layout.length; i++) { + config.hb.push({ + node: config.layout[i].node + }); + } + } + + Object.keys(config.hb).forEach((get_node, i) => { + Object.keys(config.hb[i]).forEach(key => { + if (key.indexOf(container) > -1) { + if (heartbeat_args.indexOf('delete') > -1) { + delete config.hb[i][key]; + proceed = 1; + } else { + config.hb[i][key] = heartbeat_args; + proceed = 1; + } + } + }); + }); + + if (proceed === 0) { + let node = ''; + Object.keys(config.layout).forEach((get_node, i) => { + Object.keys(config.layout[i]).forEach(key => { + if (key.indexOf(container) > -1) { + node = config.layout[i].node; + } + }); + }); + + for (let i = 0; i < config.hb.length; i++) { + if (config.hb[i].node.indexOf(node) > -1 && heartbeat_args.indexOf('delete') === -1) { + config.hb[i][container] = heartbeat_args; + } + } + } + } + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end(error); + } else { + res.end('\nModified Container Arguments for ' + container); + } + }); + } +}); + +app.get('/lb', (req, res) => { + const check_token = req.query.token; + const { + container + } = req.query; + const { + container_port + } = req.query; + const { + service_port + } = req.query; + const { + lb_hosts + } = req.query; + + if ((check_token !== token) || (!check_token) || container.indexOf('*') > -1) { + res.end('\nError: Invalid Credentials'); + } else { + + if (lb_hosts) { + let proceed = 0; + + Object.keys(config.loadbalancer).forEach((get_node, i) => { + Object.keys(config.loadbalancer[i]).forEach(key => { + const get_container_name = lb_hosts.split(','); + const parse_container = get_container_name[0]; + + if (config.loadbalancer[i][key].indexOf(parse_container) > -1) { + if (lb_hosts.indexOf('none') > -1) { + proceed = 0; + } else { + proceed = 1; + config.loadbalancer[i][key] = lb_hosts + ',' + container_port + ',' + service_port; + } + } + }); + }); + + if (proceed === 0) { + if (lb_hosts.indexOf('none') > -1) { + for (let i = 0; i < config.loadbalancer.length; i++) { + for (const key in config.loadbalancer[i]) { + if (container.length > 0) { + const analyze = config.loadbalancer[i][key].split(','); + if (container.indexOf(analyze[0]) > -1) { + config.loadbalancer.splice(i, i + 1); + } + } + } + } + } else { + config.loadbalancer.push({ + container: lb_hosts + ',' + container_port + ',' + service_port + }); + } + } + configure_loadbalancer(); + } + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end(error); + } else { + res.end('\nModified Container Arguments for ' + container); + } + }); + } +}); + +app.get('/changehost', (req, res) => { + const check_token = req.query.token; + let container = ''; + let original_host = ''; + let original_container_data = ''; + let original_heartbeat_data = ''; + const new_host = req.query.newhost; + + if (req.query.container) { + container = req.query.container; + } + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + // Ensures that the host exists + let proceed = 0; + for (let i = 0; i < config.layout.length; i++) { + for (const key in config.layout[i]) { + if (container.length > 0) { + if (config.layout[i].node.indexOf(new_host) > -1) { + proceed++; + } + if (key.indexOf(container) > -1) { + if (key.indexOf(config.layout[i].node)) { + proceed++; + } + } + } + } + } + + // Find Current Host + if (proceed < 2) { + res.end('\nError: Node or Container does not exist!'); + } else { + for (let i = 0; i < config.layout.length; i++) { + for (const key in config.layout[i]) { + if (container.length > 0) { + if (key.indexOf(container) > -1) { + original_host = config.layout[i].node; + original_container_data = config.layout[i][key]; + delete config.layout[i][key]; + } + } + } + } + + // Checks for HB + if (config.hb) { + for (let i = 0; i < config.hb.length; i++) { + for (const key in config.hb[i]) { + if (container.length > 0) { + if (key.indexOf(container) > -1) { + original_heartbeat_data = config.hb[i][key]; + delete config.hb[i][key]; + } + } + } + } + } + + for (let i = 0; i < config.layout.length; i++) { + if (config.layout[i].node.indexOf(new_host) > -1) { + config.layout[i][container] = original_container_data; + } + } + + // Adds Heartbeat Data + if (config.hb) { + if (original_heartbeat_data) { + for (let i = 0; i < config.hb.length; i++) { + if (config.hb[i].node.indexOf(new_host) > -1) { + config.hb[i][container] = original_heartbeat_data; + } + } + } + } + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end(error); + } else { + migrate(container, original_host, new_host, original_container_data); + res.end('\nMigration may take awhile. Please observe the logs and running containers for the latest information.'); + } + }); + } + } +}); + +function delete_function(name, node) { + + superagent + .post(scheme + node + ':' + agent_port + '/run') + .send({ + token: token, + command: 'docker container rm -f ' + name + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + console.log('\n' + error); + } + }); +} + +app.post('/listcontainers', (req, res) => { + let { + node + } = req.body; + const check_token = req.body.token; + const output = []; + let container; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + for (let i = 0; i < config.layout.length; i++) { + for (const key in config.layout[i]) { + if (config.layout[i].hasOwnProperty(key)) { + container = key; + node = config.layout[i].node; + const check_port = config.layout[i][key]; + if (check_port !== node) { + output.push(container); + } + } + } + } + res.send(output); + } +}); + +app.post('/listnodes', (req, res) => { + const check_token = req.body.token; + const output = []; + let node; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + for (let i = 0; i < config.layout.length; i++) { + for (const key in config.layout[i]) { + if (config.layout[i].hasOwnProperty(key)) { + node = config.layout[i].node; + const port_check = config.layout[i][key]; + if (port_check === node) { + output.push(node); + } + } + } + } + res.send(output); + } +}); + +function copyToAgents(data, file, config_file, temp_file) { + Object.keys(config.layout).forEach((get_node, i) => { + const { + node + } = config.layout[i]; + + const formData = { + name: file, + token, + config_file: config_file, + data: data + }; + + setTimeout(() => { + superagent + .post(`${scheme}${node}:${agent_port}/receive-file`) + .send(formData) + .set('accept', 'json') + .end((error, response) => { + try { + if (!config_file) { + addLog('\nCopied ' + file + ' to ' + node); + console.log('\nCopied ' + file + ' to ' + node); + } + } catch (error) { + console.log('\nResponse= ' + response); + console.log('\n' + formData); + console.log('\nError sending file to agent: ' + error); + } + }); + }, 3000); + }); + if (temp_file) { + fs.unlink(temp_file, error => { + if (error) { + console.log(error); + } + }); + } +} + +app.post('/receive-file', upload.single('file'), (req, res) => { + const check_token = req.body.formData.token; + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + copyToAgents(req.body, req.body.formData.original_name, '', req.body.formData.file.path); + res.end(''); + } +}); + +app.post('/listcommands', (req, res) => { + const check_token = req.body.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else if (config.commandlist) { + res.end(JSON.stringify(config.commandlist)); + } else { + res.end(''); + } +}); + +function swarm_remove() { + for (let i = 0; i < config.layout.length; i++) { + const { + node + } = config.layout[i]; + + superagent + .post(`${scheme}${node}:${agent_port}/run`) + .send({ + token: token, + command: 'docker swarm leave --force' + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + console.log('An error has occurred.'); + } else { + const results = JSON.parse(response.text); + addLog('\nNode:' + results.node + '\n' + results.output); + } + }); + } +} + +function swarm_nodes(swarm_token, host) { + for (let i = 0; i < config.layout.length; i++) { + const { + node + } = config.layout[i]; + if (host.indexOf(node) > -1) { + console.log('\n' + node + ' is already set as the master.'); + } else { + superagent + // .post(`${scheme}${server}:${server_port}/updateconfig` + .post(`${scheme}${node}:${agent_port}/run`) + .send({ + token: token, + command: 'docker swarm join --token ' + swarm_token + ' ' + host + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + console.log('An error has occurred.'); + } else { + const results = JSON.parse(response.text); + console.log(results); + addLog('\nNode:' + results.node + '\n' + results.output); + } + }); + } + } +} + +app.post('/swarm-create', (req, res) => { + const check_token = req.body.token; + const { + host + } = req.body; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + for (let i = 0; i < config.layout.length; i++) { + const { + node + } = config.layout[i]; + + if (host.indexOf(node) > -1) { + superagent + .post(`${scheme}${node}:${agent_port}/run`) + .send({ + token: token, + command: 'docker swarm init' + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end('An error has occurred.'); + } else { + const results = JSON.parse(response.text); + const get_output = results.output.toString(); + + if (get_output.indexOf('SWMTKN') > -1 || config.swarm_token) { + if (!config.swarm_token) { + const get_swarm_token_line = get_output.split('--token'); + const get_swarm_token = get_swarm_token_line[1].split(' '); + config.swarm_token = get_swarm_token[1]; + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end('An error occurred: ' + error); + } else { + bootstrap.status = 1; + console.log('\nAdded Swarm Token to config file.'); + } + }); + } + swarm_nodes(config.swarm_token, host); + } else { + res.end('Error creating Swarm.' + results.output); + } + } + }); + } + } + res.end('Swarm Operation Complete'); + } +}); + +app.post('/swarm-network-create', (req, res) => { + const check_token = req.body.token; + const { + host + } = req.body; + const { + network + } = req.body; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + for (let i = 0; i < config.layout.length; i++) { + const { + node + } = config.layout[i]; + + if (host.indexOf(node) > -1) { + superagent + .post(`${scheme}${node}:${agent_port}/run`) + .send({ + token: token, + command: 'docker network create -d overlay --attachable ' + network + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end('An error has occurred.'); + } else { + const results = JSON.parse(response.text); + res.end(results.output); + } + }); + } + } + res.end(''); + } +}); + +app.post('/swarm-remove', (req, res) => { + if (config.swarm_token) { + delete config.swarm_token; + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + console.log('An error occurred: ' + error); + } else { + bootstrap.status = 1; + console.log('\nRemoved Swarm Token from config file.'); + } + }); + } + + const check_token = req.body.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + swarm_remove(); + res.end('\nRemoved Swarm Token from config file.'); + } +}); + +app.post('/exec', (req, res) => { + const check_token = req.body.token; + let selected_node = ''; + let command_log = ''; + const url = []; + + if (req.body.node) { + selected_node = req.body.node; + } + + if (selected_node.indexOf('*') > -1) { + selected_node = ''; + } + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + for (let i = 0; i < config.layout.length; i++) { + const { + node + } = config.layout[i]; + const make_url = `${scheme}${node}:${agent_port}/run`; + + if (selected_node.length > -1 && selected_node.indexOf(node) > -1) { + url.push(make_url); + } + + if (selected_node.length === 0) { + url.push(make_url); + } + } + + async.eachSeries(url, (url, cb) => { + superagent + .post(url) + .send({ + token: token, + command: req.body.command + }) + .set('accept', 'json') + .end((error, response) => { + try { + if ((response && response.text)) { + const data = JSON.parse(response.text); + command_log += 'Node: ' + data.node + '\n\n' + data.output + '\n\n'; + } + cb(error); + } catch (error) { + console.log(error); + } + }); + }, err => { + if (err) { + console.log('\nError: ' + err); + } + res.end(command_log); + }); + } +}); + +app.post('/syslog', (req, res) => { + const check_token = req.body.token; + let complete_syslog = ''; + const url = []; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + for (let i = 0; i < config.layout.length; i++) { + const { + node + } = config.layout[i]; + + make_url = `${scheme}${node}:${agent_port}/run`; + url.push(make_url); + } + + async.eachSeries(url, (url, cb) => { + superagent + .post(url) + .send({ + token: token, + command: config.syslog + }) + .set('accept', 'json') + .end((error, response) => { + try { + const data = JSON.parse(response.text); + complete_syslog += 'Node: ' + data.node + '\n\n' + data.output + '\n\n'; + cb(error); + } catch (error) { + console.log(error); + } + }); + }, err => { + if (err) { + console.log('\nError: ' + err); + } + res.end(complete_syslog); + }); + } +}); + +app.post('/prune', (req, res) => { + const check_token = req.body.token; + const url = []; + let command_log = ''; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + for (let i = 0; i < config.layout.length; i++) { + const { + node + } = config.layout[i]; + const make_url = `${scheme}${node}:${agent_port}/run`; + url.push(make_url); + } + + async.eachSeries(url, (url, cb) => { + superagent + .post(url) + .send({ + token: token, + command: 'docker system prune -a -f' + }) + .set('accept', 'json') + .end((error, response) => { + try { + const data = JSON.parse(response.text); + command_log += 'Node: ' + data.node + '\n\n' + data.output + '\n\n'; + cb(error); + } catch (error) { + console.log(error); + } + }); + }, err => { + if (err) { + console.log('\nError: ' + err); + } + res.end(command_log); + }); + } +}); + +function move_container(container, newhost) { + console.log('\nMigrating container ' + container + ' to ' + newhost + '......'); + addLog('\nMigrating container ' + container + ' to ' + newhost + '......'); + superagent + .get(`${scheme}${server}:${server_port}/changehost`) + .query({ + token: token, + container, + newhost + }) + .end((error, response) => { + if (error) { + console.log('Error connecting with server. ' + error); + } else { + config.automatic_heartbeat = 'enabled'; + } + }); +} + +function container_failover(container) { + let container_fail_counter = 0; + let proceed = ''; + + for (const key in container_faillog) { + if (log.hasOwnProperty(key)) { + if (container_faillog[key].indexOf(container) > -1) { + container_fail_counter++; + } + } + } + + if (container_fail_counter >= 3) { + for (const bkey in container_faillog) { + if (container_faillog[bkey].indexOf(container) > -1) { + delete container_faillog[bkey]; + proceed = 1; + } + } + + if (proceed) { + for (const key in config.container_host_constraints) { + if (config.container_host_constraints.hasOwnProperty(key)) { + const analyze = config.container_host_constraints[key].container.split(','); + if (container.indexOf(analyze[0]) > -1) { + analyze.splice(0, 1); + const newhost = analyze[Math.floor(Math.random() * analyze.length)]; + move_container(container, newhost); + config.automatic_heartbeat = 'disabled'; + } + } + } + } + } +} + +function hb_check(node, container_port, container) { + if (config.automatic_heartbeat.indexOf('enabled') > -1) { + const client = config.ssl ? new tls.TLSSocket() : new net.Socket(); + + client.connect(container_port, node, container, () => {}); + + client.on('end', () => { + addLog('\nA Heart Beat Check Just Ran.'); + }); + + client.on('error', () => { + addLog('\n' + container + ' failed on: ' + node); + console.log('\n' + container + ' failed on: ' + node); + + if (config.container_host_constraints) { + container_faillog.push(container); + container_failover(container); + } + superagent + .post(`${scheme}${node}:${agent_port}/run`) + .send({ + token: token, + command: 'docker restart ' + container + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + console.log(error); + } + }); + }); + } +} + +app.get('/hb', (req, res) => { + const check_token = req.query.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + let node = ''; + let check_port = ''; + let container = ''; + + for (let i = 0; i < config.hb.length; i++) { + for (const key in config.hb[i]) { + if (config.hb[i].hasOwnProperty(key)) { + container = key; + node = config.hb[i].node; + check_port = config.hb[i][key]; + + if (check_port !== node) { + hb_check(node, check_port, container); + } + } + } + } + res.end(''); + } +}); + +app.get('/log', (req, res) => { + const check_token = req.query.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + res.send(log); + } +}); + +app.get('/rsyslog', (req, res) => { + const check_token = req.query.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + superagent + .get(`${scheme}${rsyslog_host}:${agent_port}/rsyslog`) + .query({ + token: token + }) + .end((error, response) => { + if (!error && response.text) { + res.end(response.text); + } else { + res.end('Error connecting with server. ' + error); + } + }); + } +}); + +function reloadConfig() { + if (process.env.PICLUSTER_CONFIG) { + config = JSON.parse(fs.readFileSync(process.env.PICLUSTER_CONFIG, 'utf8')); + } else { + config = JSON.parse(fs.readFileSync('../config.json', 'utf8')); + } + + token = config.token; + dockerFolder = config.docker; + rsyslog_host = config.rsyslog_host; + + if (config.heartbeat_interval && config.automatic_heartbeat) { + if (config.automatic_heartbeat.indexOf('enabled') > -1) { + console.log('\nEnabing Heartbeat.'); + automatic_heartbeat(); + } + } + addLog('\nReloading Config.json\n'); +} + +app.get('/getconfig', (req, res) => { + const check_token = req.query.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + res.send(config); + } +}); + +app.get('/gethosts', (req, res) => { + const check_token = req.query.token; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + let hosts = fs.readFileSync('/etc/hosts', 'utf8'); + res.send(hosts); + } +}); + +app.post('/elasticsearch', (req, res) => { + const check_token = req.body.token; + const elasticsearch = req.body.elasticsearch_url; + const { + mode + } = req.body; + + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + if (mode === 'add') { + if (config.elasticsearch) { + console.log('\nError, Elasticsearch is already configured.'); + } else { + config.elasticsearch = elasticsearch; + console.log('\nAdded Elasticsearch configuration for: ' + elasticsearch); + } + } + if (mode === 'kibana') { + if (config.kibana) { + console.log('\nError, Kibana is already configured.'); + } else { + config.kibana = elasticsearch; + console.log('\nAdded Kibana configuration for: ' + elasticsearch); + } + } + if (mode === 'delete') { + if (config.kibana) { + console.log('\nDeleted Kibana configuration.'); + delete config.kibana; + } + if (config.elasticsearch) { + delete config.elasticsearch; + console.log('\nDeleted Elasticsearch configuration.'); + } + } + + superagent + .post(`${scheme}${server}:${server_port}/updateconfig`) + .send({ + token: token, + payload: JSON.stringify(config) + }) + .set('accept', 'json') + .end((error, response) => { + if (error) { + res.end('An error occurred: ' + error); + } else { + res.end(); + console.log('\nUpdated Elasticsearch configuration.'); + } + }); + } +}); + +app.post('/updatehosts', (req, res) => { + let { + payload + } = req.body; + const check_token = req.body.token; + + try { + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + setTimeout(() => { + // fs.writeFile(config_file, payload, err => { + // if (err) { + // console.log('\nError while writing config.' + err); + // } else { + copyToAgents(payload, '/etc/hosts', '', ''); + // reloadConfig(); + res.end('Updated Hosts.'); + // } + // }); + }, 3000); + } + } catch (error) { + res.end('Error: Invalid JSON. Configuration not saved.'); + } +}); + +app.post('/updateconfig', (req, res) => { + let { + payload + } = req.body; + const check_token = req.body.token; + + try { + const verify_payload = JSON.parse(req.body.payload); + if ((check_token !== token) || (!check_token)) { + res.end('\nError: Invalid Credentials'); + } else { + payload = JSON.stringify(verify_payload, null, 4); + + setTimeout(() => { + fs.writeFile(config_file, payload, err => { + if (err) { + console.log('\nError while writing config.' + err); + } else { + copyToAgents(payload, config_file, 'config', ''); + reloadConfig(); + res.end('Updated Configuration.'); + } + }); + }, 3000); + } + } catch (error) { + res.end('Error: Invalid JSON. Configuration not saved.'); + } +}); + +if (config.ssl && config.ssl_cert && config.ssl_key) { + console.log('SSL Server API enabled'); + const ssl_options = { + cert: fs.readFileSync(config.ssl_cert), + key: fs.readFileSync(config.ssl_key) + }; + const server = https.createServer(ssl_options, app); + server.listen(server_port, () => { + console.log('Listening on port %d', server_port); + }); +} else { + console.log('Non-SSL Server API enabled'); + const server = http.createServer(app); + server.listen(server_port, () => { + console.log('Listening on port %d', server_port); + }); +} \ No newline at end of file diff --git a/ssl/.gitkeep b/ssl/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/assets/circle.css b/web/assets/circle.css new file mode 100755 index 0000000..b69b052 --- /dev/null +++ b/web/assets/circle.css @@ -0,0 +1,1065 @@ +.rect-auto, +.c100.p51 .slice, +.c100.p52 .slice, +.c100.p53 .slice, +.c100.p54 .slice, +.c100.p55 .slice, +.c100.p56 .slice, +.c100.p57 .slice, +.c100.p58 .slice, +.c100.p59 .slice, +.c100.p60 .slice, +.c100.p61 .slice, +.c100.p62 .slice, +.c100.p63 .slice, +.c100.p64 .slice, +.c100.p65 .slice, +.c100.p66 .slice, +.c100.p67 .slice, +.c100.p68 .slice, +.c100.p69 .slice, +.c100.p70 .slice, +.c100.p71 .slice, +.c100.p72 .slice, +.c100.p73 .slice, +.c100.p74 .slice, +.c100.p75 .slice, +.c100.p76 .slice, +.c100.p77 .slice, +.c100.p78 .slice, +.c100.p79 .slice, +.c100.p80 .slice, +.c100.p81 .slice, +.c100.p82 .slice, +.c100.p83 .slice, +.c100.p84 .slice, +.c100.p85 .slice, +.c100.p86 .slice, +.c100.p87 .slice, +.c100.p88 .slice, +.c100.p89 .slice, +.c100.p90 .slice, +.c100.p91 .slice, +.c100.p92 .slice, +.c100.p93 .slice, +.c100.p94 .slice, +.c100.p95 .slice, +.c100.p96 .slice, +.c100.p97 .slice, +.c100.p98 .slice, +.c100.p99 .slice, +.c100.p100 .slice { + clip: rect(auto, auto, auto, auto); +} +.pie, +.c100 .bar, +.c100.p51 .fill, +.c100.p52 .fill, +.c100.p53 .fill, +.c100.p54 .fill, +.c100.p55 .fill, +.c100.p56 .fill, +.c100.p57 .fill, +.c100.p58 .fill, +.c100.p59 .fill, +.c100.p60 .fill, +.c100.p61 .fill, +.c100.p62 .fill, +.c100.p63 .fill, +.c100.p64 .fill, +.c100.p65 .fill, +.c100.p66 .fill, +.c100.p67 .fill, +.c100.p68 .fill, +.c100.p69 .fill, +.c100.p70 .fill, +.c100.p71 .fill, +.c100.p72 .fill, +.c100.p73 .fill, +.c100.p74 .fill, +.c100.p75 .fill, +.c100.p76 .fill, +.c100.p77 .fill, +.c100.p78 .fill, +.c100.p79 .fill, +.c100.p80 .fill, +.c100.p81 .fill, +.c100.p82 .fill, +.c100.p83 .fill, +.c100.p84 .fill, +.c100.p85 .fill, +.c100.p86 .fill, +.c100.p87 .fill, +.c100.p88 .fill, +.c100.p89 .fill, +.c100.p90 .fill, +.c100.p91 .fill, +.c100.p92 .fill, +.c100.p93 .fill, +.c100.p94 .fill, +.c100.p95 .fill, +.c100.p96 .fill, +.c100.p97 .fill, +.c100.p98 .fill, +.c100.p99 .fill, +.c100.p100 .fill { + position: absolute; + border: 0.08em solid #307bbb; + width: 0.84em; + height: 0.84em; + clip: rect(0em, 0.5em, 1em, 0em); + border-radius: 50%; + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); +} +.pie-fill, +.c100.p51 .bar:after, +.c100.p51 .fill, +.c100.p52 .bar:after, +.c100.p52 .fill, +.c100.p53 .bar:after, +.c100.p53 .fill, +.c100.p54 .bar:after, +.c100.p54 .fill, +.c100.p55 .bar:after, +.c100.p55 .fill, +.c100.p56 .bar:after, +.c100.p56 .fill, +.c100.p57 .bar:after, +.c100.p57 .fill, +.c100.p58 .bar:after, +.c100.p58 .fill, +.c100.p59 .bar:after, +.c100.p59 .fill, +.c100.p60 .bar:after, +.c100.p60 .fill, +.c100.p61 .bar:after, +.c100.p61 .fill, +.c100.p62 .bar:after, +.c100.p62 .fill, +.c100.p63 .bar:after, +.c100.p63 .fill, +.c100.p64 .bar:after, +.c100.p64 .fill, +.c100.p65 .bar:after, +.c100.p65 .fill, +.c100.p66 .bar:after, +.c100.p66 .fill, +.c100.p67 .bar:after, +.c100.p67 .fill, +.c100.p68 .bar:after, +.c100.p68 .fill, +.c100.p69 .bar:after, +.c100.p69 .fill, +.c100.p70 .bar:after, +.c100.p70 .fill, +.c100.p71 .bar:after, +.c100.p71 .fill, +.c100.p72 .bar:after, +.c100.p72 .fill, +.c100.p73 .bar:after, +.c100.p73 .fill, +.c100.p74 .bar:after, +.c100.p74 .fill, +.c100.p75 .bar:after, +.c100.p75 .fill, +.c100.p76 .bar:after, +.c100.p76 .fill, +.c100.p77 .bar:after, +.c100.p77 .fill, +.c100.p78 .bar:after, +.c100.p78 .fill, +.c100.p79 .bar:after, +.c100.p79 .fill, +.c100.p80 .bar:after, +.c100.p80 .fill, +.c100.p81 .bar:after, +.c100.p81 .fill, +.c100.p82 .bar:after, +.c100.p82 .fill, +.c100.p83 .bar:after, +.c100.p83 .fill, +.c100.p84 .bar:after, +.c100.p84 .fill, +.c100.p85 .bar:after, +.c100.p85 .fill, +.c100.p86 .bar:after, +.c100.p86 .fill, +.c100.p87 .bar:after, +.c100.p87 .fill, +.c100.p88 .bar:after, +.c100.p88 .fill, +.c100.p89 .bar:after, +.c100.p89 .fill, +.c100.p90 .bar:after, +.c100.p90 .fill, +.c100.p91 .bar:after, +.c100.p91 .fill, +.c100.p92 .bar:after, +.c100.p92 .fill, +.c100.p93 .bar:after, +.c100.p93 .fill, +.c100.p94 .bar:after, +.c100.p94 .fill, +.c100.p95 .bar:after, +.c100.p95 .fill, +.c100.p96 .bar:after, +.c100.p96 .fill, +.c100.p97 .bar:after, +.c100.p97 .fill, +.c100.p98 .bar:after, +.c100.p98 .fill, +.c100.p99 .bar:after, +.c100.p99 .fill, +.c100.p100 .bar:after, +.c100.p100 .fill { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.c100 { + position: relative; + font-size: 120px; + width: 1em; + height: 1em; + border-radius: 50%; + float: left; + margin: 0 0.1em 0.1em 0; + background-color: #cccccc; +} +.c100 *, +.c100 *:before, +.c100 *:after { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +.c100.center { + float: none; + margin: 0 auto; +} +.c100.big { + font-size: 240px; +} +.c100.small { + font-size: 67px; +} +.c100 > span { + position: absolute; + width: 100%; + z-index: 1; + left: 0; + top: 0; + width: 5em; + line-height: 5em; + font-size: 0.2em; + color: #cccccc; + display: block; + text-align: center; + white-space: nowrap; + -webkit-transition-property: all; + -moz-transition-property: all; + -o-transition-property: all; + transition-property: all; + -webkit-transition-duration: 0.2s; + -moz-transition-duration: 0.2s; + -o-transition-duration: 0.2s; + transition-duration: 0.2s; + -webkit-transition-timing-function: ease-out; + -moz-transition-timing-function: ease-out; + -o-transition-timing-function: ease-out; + transition-timing-function: ease-out; +} +.c100:after { + position: absolute; + top: 0.08em; + left: 0.08em; + display: block; + content: " "; + border-radius: 50%; + background-color: #f5f5f5; + width: 0.84em; + height: 0.84em; + -webkit-transition-property: all; + -moz-transition-property: all; + -o-transition-property: all; + transition-property: all; + -webkit-transition-duration: 0.2s; + -moz-transition-duration: 0.2s; + -o-transition-duration: 0.2s; + transition-duration: 0.2s; + -webkit-transition-timing-function: ease-in; + -moz-transition-timing-function: ease-in; + -o-transition-timing-function: ease-in; + transition-timing-function: ease-in; +} +.c100 .slice { + position: absolute; + width: 1em; + height: 1em; + clip: rect(0em, 1em, 1em, 0.5em); +} +.c100.p1 .bar { + -webkit-transform: rotate(3.6deg); + -moz-transform: rotate(3.6deg); + -ms-transform: rotate(3.6deg); + -o-transform: rotate(3.6deg); + transform: rotate(3.6deg); +} +.c100.p2 .bar { + -webkit-transform: rotate(7.2deg); + -moz-transform: rotate(7.2deg); + -ms-transform: rotate(7.2deg); + -o-transform: rotate(7.2deg); + transform: rotate(7.2deg); +} +.c100.p3 .bar { + -webkit-transform: rotate(10.8deg); + -moz-transform: rotate(10.8deg); + -ms-transform: rotate(10.8deg); + -o-transform: rotate(10.8deg); + transform: rotate(10.8deg); +} +.c100.p4 .bar { + -webkit-transform: rotate(14.4deg); + -moz-transform: rotate(14.4deg); + -ms-transform: rotate(14.4deg); + -o-transform: rotate(14.4deg); + transform: rotate(14.4deg); +} +.c100.p5 .bar { + -webkit-transform: rotate(18deg); + -moz-transform: rotate(18deg); + -ms-transform: rotate(18deg); + -o-transform: rotate(18deg); + transform: rotate(18deg); +} +.c100.p6 .bar { + -webkit-transform: rotate(21.6deg); + -moz-transform: rotate(21.6deg); + -ms-transform: rotate(21.6deg); + -o-transform: rotate(21.6deg); + transform: rotate(21.6deg); +} +.c100.p7 .bar { + -webkit-transform: rotate(25.2deg); + -moz-transform: rotate(25.2deg); + -ms-transform: rotate(25.2deg); + -o-transform: rotate(25.2deg); + transform: rotate(25.2deg); +} +.c100.p8 .bar { + -webkit-transform: rotate(28.8deg); + -moz-transform: rotate(28.8deg); + -ms-transform: rotate(28.8deg); + -o-transform: rotate(28.8deg); + transform: rotate(28.8deg); +} +.c100.p9 .bar { + -webkit-transform: rotate(32.4deg); + -moz-transform: rotate(32.4deg); + -ms-transform: rotate(32.4deg); + -o-transform: rotate(32.4deg); + transform: rotate(32.4deg); +} +.c100.p10 .bar { + -webkit-transform: rotate(36deg); + -moz-transform: rotate(36deg); + -ms-transform: rotate(36deg); + -o-transform: rotate(36deg); + transform: rotate(36deg); +} +.c100.p11 .bar { + -webkit-transform: rotate(39.6deg); + -moz-transform: rotate(39.6deg); + -ms-transform: rotate(39.6deg); + -o-transform: rotate(39.6deg); + transform: rotate(39.6deg); +} +.c100.p12 .bar { + -webkit-transform: rotate(43.2deg); + -moz-transform: rotate(43.2deg); + -ms-transform: rotate(43.2deg); + -o-transform: rotate(43.2deg); + transform: rotate(43.2deg); +} +.c100.p13 .bar { + -webkit-transform: rotate(46.800000000000004deg); + -moz-transform: rotate(46.800000000000004deg); + -ms-transform: rotate(46.800000000000004deg); + -o-transform: rotate(46.800000000000004deg); + transform: rotate(46.800000000000004deg); +} +.c100.p14 .bar { + -webkit-transform: rotate(50.4deg); + -moz-transform: rotate(50.4deg); + -ms-transform: rotate(50.4deg); + -o-transform: rotate(50.4deg); + transform: rotate(50.4deg); +} +.c100.p15 .bar { + -webkit-transform: rotate(54deg); + -moz-transform: rotate(54deg); + -ms-transform: rotate(54deg); + -o-transform: rotate(54deg); + transform: rotate(54deg); +} +.c100.p16 .bar { + -webkit-transform: rotate(57.6deg); + -moz-transform: rotate(57.6deg); + -ms-transform: rotate(57.6deg); + -o-transform: rotate(57.6deg); + transform: rotate(57.6deg); +} +.c100.p17 .bar { + -webkit-transform: rotate(61.2deg); + -moz-transform: rotate(61.2deg); + -ms-transform: rotate(61.2deg); + -o-transform: rotate(61.2deg); + transform: rotate(61.2deg); +} +.c100.p18 .bar { + -webkit-transform: rotate(64.8deg); + -moz-transform: rotate(64.8deg); + -ms-transform: rotate(64.8deg); + -o-transform: rotate(64.8deg); + transform: rotate(64.8deg); +} +.c100.p19 .bar { + -webkit-transform: rotate(68.4deg); + -moz-transform: rotate(68.4deg); + -ms-transform: rotate(68.4deg); + -o-transform: rotate(68.4deg); + transform: rotate(68.4deg); +} +.c100.p20 .bar { + -webkit-transform: rotate(72deg); + -moz-transform: rotate(72deg); + -ms-transform: rotate(72deg); + -o-transform: rotate(72deg); + transform: rotate(72deg); +} +.c100.p21 .bar { + -webkit-transform: rotate(75.60000000000001deg); + -moz-transform: rotate(75.60000000000001deg); + -ms-transform: rotate(75.60000000000001deg); + -o-transform: rotate(75.60000000000001deg); + transform: rotate(75.60000000000001deg); +} +.c100.p22 .bar { + -webkit-transform: rotate(79.2deg); + -moz-transform: rotate(79.2deg); + -ms-transform: rotate(79.2deg); + -o-transform: rotate(79.2deg); + transform: rotate(79.2deg); +} +.c100.p23 .bar { + -webkit-transform: rotate(82.8deg); + -moz-transform: rotate(82.8deg); + -ms-transform: rotate(82.8deg); + -o-transform: rotate(82.8deg); + transform: rotate(82.8deg); +} +.c100.p24 .bar { + -webkit-transform: rotate(86.4deg); + -moz-transform: rotate(86.4deg); + -ms-transform: rotate(86.4deg); + -o-transform: rotate(86.4deg); + transform: rotate(86.4deg); +} +.c100.p25 .bar { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.c100.p26 .bar { + -webkit-transform: rotate(93.60000000000001deg); + -moz-transform: rotate(93.60000000000001deg); + -ms-transform: rotate(93.60000000000001deg); + -o-transform: rotate(93.60000000000001deg); + transform: rotate(93.60000000000001deg); +} +.c100.p27 .bar { + -webkit-transform: rotate(97.2deg); + -moz-transform: rotate(97.2deg); + -ms-transform: rotate(97.2deg); + -o-transform: rotate(97.2deg); + transform: rotate(97.2deg); +} +.c100.p28 .bar { + -webkit-transform: rotate(100.8deg); + -moz-transform: rotate(100.8deg); + -ms-transform: rotate(100.8deg); + -o-transform: rotate(100.8deg); + transform: rotate(100.8deg); +} +.c100.p29 .bar { + -webkit-transform: rotate(104.4deg); + -moz-transform: rotate(104.4deg); + -ms-transform: rotate(104.4deg); + -o-transform: rotate(104.4deg); + transform: rotate(104.4deg); +} +.c100.p30 .bar { + -webkit-transform: rotate(108deg); + -moz-transform: rotate(108deg); + -ms-transform: rotate(108deg); + -o-transform: rotate(108deg); + transform: rotate(108deg); +} +.c100.p31 .bar { + -webkit-transform: rotate(111.60000000000001deg); + -moz-transform: rotate(111.60000000000001deg); + -ms-transform: rotate(111.60000000000001deg); + -o-transform: rotate(111.60000000000001deg); + transform: rotate(111.60000000000001deg); +} +.c100.p32 .bar { + -webkit-transform: rotate(115.2deg); + -moz-transform: rotate(115.2deg); + -ms-transform: rotate(115.2deg); + -o-transform: rotate(115.2deg); + transform: rotate(115.2deg); +} +.c100.p33 .bar { + -webkit-transform: rotate(118.8deg); + -moz-transform: rotate(118.8deg); + -ms-transform: rotate(118.8deg); + -o-transform: rotate(118.8deg); + transform: rotate(118.8deg); +} +.c100.p34 .bar { + -webkit-transform: rotate(122.4deg); + -moz-transform: rotate(122.4deg); + -ms-transform: rotate(122.4deg); + -o-transform: rotate(122.4deg); + transform: rotate(122.4deg); +} +.c100.p35 .bar { + -webkit-transform: rotate(126deg); + -moz-transform: rotate(126deg); + -ms-transform: rotate(126deg); + -o-transform: rotate(126deg); + transform: rotate(126deg); +} +.c100.p36 .bar { + -webkit-transform: rotate(129.6deg); + -moz-transform: rotate(129.6deg); + -ms-transform: rotate(129.6deg); + -o-transform: rotate(129.6deg); + transform: rotate(129.6deg); +} +.c100.p37 .bar { + -webkit-transform: rotate(133.20000000000002deg); + -moz-transform: rotate(133.20000000000002deg); + -ms-transform: rotate(133.20000000000002deg); + -o-transform: rotate(133.20000000000002deg); + transform: rotate(133.20000000000002deg); +} +.c100.p38 .bar { + -webkit-transform: rotate(136.8deg); + -moz-transform: rotate(136.8deg); + -ms-transform: rotate(136.8deg); + -o-transform: rotate(136.8deg); + transform: rotate(136.8deg); +} +.c100.p39 .bar { + -webkit-transform: rotate(140.4deg); + -moz-transform: rotate(140.4deg); + -ms-transform: rotate(140.4deg); + -o-transform: rotate(140.4deg); + transform: rotate(140.4deg); +} +.c100.p40 .bar { + -webkit-transform: rotate(144deg); + -moz-transform: rotate(144deg); + -ms-transform: rotate(144deg); + -o-transform: rotate(144deg); + transform: rotate(144deg); +} +.c100.p41 .bar { + -webkit-transform: rotate(147.6deg); + -moz-transform: rotate(147.6deg); + -ms-transform: rotate(147.6deg); + -o-transform: rotate(147.6deg); + transform: rotate(147.6deg); +} +.c100.p42 .bar { + -webkit-transform: rotate(151.20000000000002deg); + -moz-transform: rotate(151.20000000000002deg); + -ms-transform: rotate(151.20000000000002deg); + -o-transform: rotate(151.20000000000002deg); + transform: rotate(151.20000000000002deg); +} +.c100.p43 .bar { + -webkit-transform: rotate(154.8deg); + -moz-transform: rotate(154.8deg); + -ms-transform: rotate(154.8deg); + -o-transform: rotate(154.8deg); + transform: rotate(154.8deg); +} +.c100.p44 .bar { + -webkit-transform: rotate(158.4deg); + -moz-transform: rotate(158.4deg); + -ms-transform: rotate(158.4deg); + -o-transform: rotate(158.4deg); + transform: rotate(158.4deg); +} +.c100.p45 .bar { + -webkit-transform: rotate(162deg); + -moz-transform: rotate(162deg); + -ms-transform: rotate(162deg); + -o-transform: rotate(162deg); + transform: rotate(162deg); +} +.c100.p46 .bar { + -webkit-transform: rotate(165.6deg); + -moz-transform: rotate(165.6deg); + -ms-transform: rotate(165.6deg); + -o-transform: rotate(165.6deg); + transform: rotate(165.6deg); +} +.c100.p47 .bar { + -webkit-transform: rotate(169.20000000000002deg); + -moz-transform: rotate(169.20000000000002deg); + -ms-transform: rotate(169.20000000000002deg); + -o-transform: rotate(169.20000000000002deg); + transform: rotate(169.20000000000002deg); +} +.c100.p48 .bar { + -webkit-transform: rotate(172.8deg); + -moz-transform: rotate(172.8deg); + -ms-transform: rotate(172.8deg); + -o-transform: rotate(172.8deg); + transform: rotate(172.8deg); +} +.c100.p49 .bar { + -webkit-transform: rotate(176.4deg); + -moz-transform: rotate(176.4deg); + -ms-transform: rotate(176.4deg); + -o-transform: rotate(176.4deg); + transform: rotate(176.4deg); +} +.c100.p50 .bar { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.c100.p51 .bar { + -webkit-transform: rotate(183.6deg); + -moz-transform: rotate(183.6deg); + -ms-transform: rotate(183.6deg); + -o-transform: rotate(183.6deg); + transform: rotate(183.6deg); +} +.c100.p52 .bar { + -webkit-transform: rotate(187.20000000000002deg); + -moz-transform: rotate(187.20000000000002deg); + -ms-transform: rotate(187.20000000000002deg); + -o-transform: rotate(187.20000000000002deg); + transform: rotate(187.20000000000002deg); +} +.c100.p53 .bar { + -webkit-transform: rotate(190.8deg); + -moz-transform: rotate(190.8deg); + -ms-transform: rotate(190.8deg); + -o-transform: rotate(190.8deg); + transform: rotate(190.8deg); +} +.c100.p54 .bar { + -webkit-transform: rotate(194.4deg); + -moz-transform: rotate(194.4deg); + -ms-transform: rotate(194.4deg); + -o-transform: rotate(194.4deg); + transform: rotate(194.4deg); +} +.c100.p55 .bar { + -webkit-transform: rotate(198deg); + -moz-transform: rotate(198deg); + -ms-transform: rotate(198deg); + -o-transform: rotate(198deg); + transform: rotate(198deg); +} +.c100.p56 .bar { + -webkit-transform: rotate(201.6deg); + -moz-transform: rotate(201.6deg); + -ms-transform: rotate(201.6deg); + -o-transform: rotate(201.6deg); + transform: rotate(201.6deg); +} +.c100.p57 .bar { + -webkit-transform: rotate(205.20000000000002deg); + -moz-transform: rotate(205.20000000000002deg); + -ms-transform: rotate(205.20000000000002deg); + -o-transform: rotate(205.20000000000002deg); + transform: rotate(205.20000000000002deg); +} +.c100.p58 .bar { + -webkit-transform: rotate(208.8deg); + -moz-transform: rotate(208.8deg); + -ms-transform: rotate(208.8deg); + -o-transform: rotate(208.8deg); + transform: rotate(208.8deg); +} +.c100.p59 .bar { + -webkit-transform: rotate(212.4deg); + -moz-transform: rotate(212.4deg); + -ms-transform: rotate(212.4deg); + -o-transform: rotate(212.4deg); + transform: rotate(212.4deg); +} +.c100.p60 .bar { + -webkit-transform: rotate(216deg); + -moz-transform: rotate(216deg); + -ms-transform: rotate(216deg); + -o-transform: rotate(216deg); + transform: rotate(216deg); +} +.c100.p61 .bar { + -webkit-transform: rotate(219.6deg); + -moz-transform: rotate(219.6deg); + -ms-transform: rotate(219.6deg); + -o-transform: rotate(219.6deg); + transform: rotate(219.6deg); +} +.c100.p62 .bar { + -webkit-transform: rotate(223.20000000000002deg); + -moz-transform: rotate(223.20000000000002deg); + -ms-transform: rotate(223.20000000000002deg); + -o-transform: rotate(223.20000000000002deg); + transform: rotate(223.20000000000002deg); +} +.c100.p63 .bar { + -webkit-transform: rotate(226.8deg); + -moz-transform: rotate(226.8deg); + -ms-transform: rotate(226.8deg); + -o-transform: rotate(226.8deg); + transform: rotate(226.8deg); +} +.c100.p64 .bar { + -webkit-transform: rotate(230.4deg); + -moz-transform: rotate(230.4deg); + -ms-transform: rotate(230.4deg); + -o-transform: rotate(230.4deg); + transform: rotate(230.4deg); +} +.c100.p65 .bar { + -webkit-transform: rotate(234deg); + -moz-transform: rotate(234deg); + -ms-transform: rotate(234deg); + -o-transform: rotate(234deg); + transform: rotate(234deg); +} +.c100.p66 .bar { + -webkit-transform: rotate(237.6deg); + -moz-transform: rotate(237.6deg); + -ms-transform: rotate(237.6deg); + -o-transform: rotate(237.6deg); + transform: rotate(237.6deg); +} +.c100.p67 .bar { + -webkit-transform: rotate(241.20000000000002deg); + -moz-transform: rotate(241.20000000000002deg); + -ms-transform: rotate(241.20000000000002deg); + -o-transform: rotate(241.20000000000002deg); + transform: rotate(241.20000000000002deg); +} +.c100.p68 .bar { + -webkit-transform: rotate(244.8deg); + -moz-transform: rotate(244.8deg); + -ms-transform: rotate(244.8deg); + -o-transform: rotate(244.8deg); + transform: rotate(244.8deg); +} +.c100.p69 .bar { + -webkit-transform: rotate(248.4deg); + -moz-transform: rotate(248.4deg); + -ms-transform: rotate(248.4deg); + -o-transform: rotate(248.4deg); + transform: rotate(248.4deg); +} +.c100.p70 .bar { + -webkit-transform: rotate(252deg); + -moz-transform: rotate(252deg); + -ms-transform: rotate(252deg); + -o-transform: rotate(252deg); + transform: rotate(252deg); +} +.c100.p71 .bar { + -webkit-transform: rotate(255.6deg); + -moz-transform: rotate(255.6deg); + -ms-transform: rotate(255.6deg); + -o-transform: rotate(255.6deg); + transform: rotate(255.6deg); +} +.c100.p72 .bar { + -webkit-transform: rotate(259.2deg); + -moz-transform: rotate(259.2deg); + -ms-transform: rotate(259.2deg); + -o-transform: rotate(259.2deg); + transform: rotate(259.2deg); +} +.c100.p73 .bar { + -webkit-transform: rotate(262.8deg); + -moz-transform: rotate(262.8deg); + -ms-transform: rotate(262.8deg); + -o-transform: rotate(262.8deg); + transform: rotate(262.8deg); +} +.c100.p74 .bar { + -webkit-transform: rotate(266.40000000000003deg); + -moz-transform: rotate(266.40000000000003deg); + -ms-transform: rotate(266.40000000000003deg); + -o-transform: rotate(266.40000000000003deg); + transform: rotate(266.40000000000003deg); +} +.c100.p75 .bar { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.c100.p76 .bar { + -webkit-transform: rotate(273.6deg); + -moz-transform: rotate(273.6deg); + -ms-transform: rotate(273.6deg); + -o-transform: rotate(273.6deg); + transform: rotate(273.6deg); +} +.c100.p77 .bar { + -webkit-transform: rotate(277.2deg); + -moz-transform: rotate(277.2deg); + -ms-transform: rotate(277.2deg); + -o-transform: rotate(277.2deg); + transform: rotate(277.2deg); +} +.c100.p78 .bar { + -webkit-transform: rotate(280.8deg); + -moz-transform: rotate(280.8deg); + -ms-transform: rotate(280.8deg); + -o-transform: rotate(280.8deg); + transform: rotate(280.8deg); +} +.c100.p79 .bar { + -webkit-transform: rotate(284.40000000000003deg); + -moz-transform: rotate(284.40000000000003deg); + -ms-transform: rotate(284.40000000000003deg); + -o-transform: rotate(284.40000000000003deg); + transform: rotate(284.40000000000003deg); +} +.c100.p80 .bar { + -webkit-transform: rotate(288deg); + -moz-transform: rotate(288deg); + -ms-transform: rotate(288deg); + -o-transform: rotate(288deg); + transform: rotate(288deg); +} +.c100.p81 .bar { + -webkit-transform: rotate(291.6deg); + -moz-transform: rotate(291.6deg); + -ms-transform: rotate(291.6deg); + -o-transform: rotate(291.6deg); + transform: rotate(291.6deg); +} +.c100.p82 .bar { + -webkit-transform: rotate(295.2deg); + -moz-transform: rotate(295.2deg); + -ms-transform: rotate(295.2deg); + -o-transform: rotate(295.2deg); + transform: rotate(295.2deg); +} +.c100.p83 .bar { + -webkit-transform: rotate(298.8deg); + -moz-transform: rotate(298.8deg); + -ms-transform: rotate(298.8deg); + -o-transform: rotate(298.8deg); + transform: rotate(298.8deg); +} +.c100.p84 .bar { + -webkit-transform: rotate(302.40000000000003deg); + -moz-transform: rotate(302.40000000000003deg); + -ms-transform: rotate(302.40000000000003deg); + -o-transform: rotate(302.40000000000003deg); + transform: rotate(302.40000000000003deg); +} +.c100.p85 .bar { + -webkit-transform: rotate(306deg); + -moz-transform: rotate(306deg); + -ms-transform: rotate(306deg); + -o-transform: rotate(306deg); + transform: rotate(306deg); +} +.c100.p86 .bar { + -webkit-transform: rotate(309.6deg); + -moz-transform: rotate(309.6deg); + -ms-transform: rotate(309.6deg); + -o-transform: rotate(309.6deg); + transform: rotate(309.6deg); +} +.c100.p87 .bar { + -webkit-transform: rotate(313.2deg); + -moz-transform: rotate(313.2deg); + -ms-transform: rotate(313.2deg); + -o-transform: rotate(313.2deg); + transform: rotate(313.2deg); +} +.c100.p88 .bar { + -webkit-transform: rotate(316.8deg); + -moz-transform: rotate(316.8deg); + -ms-transform: rotate(316.8deg); + -o-transform: rotate(316.8deg); + transform: rotate(316.8deg); +} +.c100.p89 .bar { + -webkit-transform: rotate(320.40000000000003deg); + -moz-transform: rotate(320.40000000000003deg); + -ms-transform: rotate(320.40000000000003deg); + -o-transform: rotate(320.40000000000003deg); + transform: rotate(320.40000000000003deg); +} +.c100.p90 .bar { + -webkit-transform: rotate(324deg); + -moz-transform: rotate(324deg); + -ms-transform: rotate(324deg); + -o-transform: rotate(324deg); + transform: rotate(324deg); +} +.c100.p91 .bar { + -webkit-transform: rotate(327.6deg); + -moz-transform: rotate(327.6deg); + -ms-transform: rotate(327.6deg); + -o-transform: rotate(327.6deg); + transform: rotate(327.6deg); +} +.c100.p92 .bar { + -webkit-transform: rotate(331.2deg); + -moz-transform: rotate(331.2deg); + -ms-transform: rotate(331.2deg); + -o-transform: rotate(331.2deg); + transform: rotate(331.2deg); +} +.c100.p93 .bar { + -webkit-transform: rotate(334.8deg); + -moz-transform: rotate(334.8deg); + -ms-transform: rotate(334.8deg); + -o-transform: rotate(334.8deg); + transform: rotate(334.8deg); +} +.c100.p94 .bar { + -webkit-transform: rotate(338.40000000000003deg); + -moz-transform: rotate(338.40000000000003deg); + -ms-transform: rotate(338.40000000000003deg); + -o-transform: rotate(338.40000000000003deg); + transform: rotate(338.40000000000003deg); +} +.c100.p95 .bar { + -webkit-transform: rotate(342deg); + -moz-transform: rotate(342deg); + -ms-transform: rotate(342deg); + -o-transform: rotate(342deg); + transform: rotate(342deg); +} +.c100.p96 .bar { + -webkit-transform: rotate(345.6deg); + -moz-transform: rotate(345.6deg); + -ms-transform: rotate(345.6deg); + -o-transform: rotate(345.6deg); + transform: rotate(345.6deg); +} +.c100.p97 .bar { + -webkit-transform: rotate(349.2deg); + -moz-transform: rotate(349.2deg); + -ms-transform: rotate(349.2deg); + -o-transform: rotate(349.2deg); + transform: rotate(349.2deg); +} +.c100.p98 .bar { + -webkit-transform: rotate(352.8deg); + -moz-transform: rotate(352.8deg); + -ms-transform: rotate(352.8deg); + -o-transform: rotate(352.8deg); + transform: rotate(352.8deg); +} +.c100.p99 .bar { + -webkit-transform: rotate(356.40000000000003deg); + -moz-transform: rotate(356.40000000000003deg); + -ms-transform: rotate(356.40000000000003deg); + -o-transform: rotate(356.40000000000003deg); + transform: rotate(356.40000000000003deg); +} +.c100.p100 .bar { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); +} +.c100:hover { + cursor: default; +} +.c100:hover > span { + width: 3.33em; + line-height: 3.33em; + font-size: 0.3em; + color: #307bbb; +} +.c100:hover:after { + top: 0.04em; + left: 0.04em; + width: 0.92em; + height: 0.92em; +} +.c100.dark { + background-color: #777777; +} +.c100.dark .bar, +.c100.dark .fill { + border-color: #c6ff00 !important; +} +.c100.dark > span { + color: #777777; +} +.c100.dark:after { + background-color: #666666; +} +.c100.dark:hover > span { + color: #c6ff00; +} +.c100.green .bar, +.c100.green .fill { + border-color: #4db53c !important; +} +.c100.green:hover > span { + color: #4db53c; +} +.c100.green.dark .bar, +.c100.green.dark .fill { + border-color: #5fd400 !important; +} +.c100.green.dark:hover > span { + color: #5fd400; +} +.c100.orange .bar, +.c100.orange .fill { + border-color: #dd9d22 !important; +} +.c100.orange:hover > span { + color: #dd9d22; +} +.c100.orange.dark .bar, +.c100.orange.dark .fill { + border-color: #e08833 !important; +} +.c100.orange.dark:hover > span { + color: #e08833; +} diff --git a/web/assets/distLogo.js b/web/assets/distLogo.js new file mode 100644 index 0000000..3ea51d6 --- /dev/null +++ b/web/assets/distLogo.js @@ -0,0 +1,127 @@ +function distLogo(dist) { + var logo = document.createElement('span'); + + switch (dist) { + case 'alpine linux': + logo.className = "fl-alpine"; + logo.style.color = "#0d597f"; + break; + case 'centos': + logo.className = "fl-centos"; + break; + case 'rhel': + break; + case 'rhas': + break; + case 'red hat linux': + logo.className = "fl-redhat"; + logo.style.color = "#e93442"; + break; + case 'elementary os': + logo.className = "fl-elementary"; + break; + case 'gentoo linux': + logo.className = "fl-gentoo"; + logo.style.color = "#514575"; + break; + case 'mandriva linux': + logo.className = "fl-mandriva"; + break; + case 'raspbian': + logo.className = "fl-raspberry-pi"; + logo.style.color = "#d6264f"; + break; + case 'slackware': + logo.className = "fl-slackware"; + break; + case 'aosc': + logo.className = "fl-aosc"; + break; + case 'coreos': + logo.className = "fl-coreos"; + break; + case 'fedora': + logo.className = "fl-fedora"; + logo.style.color = "#294172"; + break; + case 'linux mint': + logo.className = "fl-linuxmint"; + logo.style.color = "#86ce3e"; + break; + case 'manjaro': + logo.className = "fl-manjaro"; + logo.style.color = "#37bf5d"; + break; + case 'apple': + break; + case 'osx': + break; + case 'macos': + break; + case 'darwin': + logo.className = "fl-apple"; + break; + case 'nixos': + logo.className = "fl-nixos"; + break; + case 'sabayon': + logo.className = "fl-sabayon"; + break; + case 'debian': + logo.className = "fl-debian"; + logo.style.color = "#d70751"; + break; + case 'ubuntu': + logo.className = "fl-ubuntu-inverse"; + logo.style.color = "#dd4814"; + + break; + case 'ubuntu linux': + logo.className = "fl-ubuntu-inverse"; + logo.style.color = "#dd4814"; + break; + case 'arch linux': + logo.className = "fl-archlinux"; + logo.style.color = "#1793d1"; + break; + case 'freebsd': + logo.className = "fl-freebsd"; + logo.style.color = "#eb0028"; + break; + case 'mageia': + logo.className = "fl-mageia"; + break; + case 'opensuse': + logo.className = "fl-opensuse"; + logo.style.color = "#73ba25"; + break; + default: + logo.className = "fl-tux"; + break; + } + + logo.className += " node_status_logo fl-72"; + + return logo.outerHTML; +} + +function getDists(arr) { + var dists = arr.filter(function(e, i) { + var pred = e.startsWith('Dist: '); + if (pred) { + arr[i] = ""; + } + return pred; + }); + dists = dists.map(function(e) { + return e.replace("Dist: ","").toLowerCase(); + }); + return dists; +} + +function addFontLinux() { + var fontLinux = document.createElement("link"); + fontLinux.rel="stylesheet"; + fontLinux.href="/node_modules/font-logos/assets/font-logos.css"; + document.head.appendChild(fontLinux); +} diff --git a/web/assets/dropzone.js b/web/assets/dropzone.js new file mode 100644 index 0000000..9e2e41f --- /dev/null +++ b/web/assets/dropzone.js @@ -0,0 +1,2052 @@ + +/* + * + * More info at [www.dropzonejs.com](http://www.dropzonejs.com) + * + * Copyright (c) 2012, Matias Meno + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +(function() { + var Dropzone, Emitter, ExifRestore, camelize, contentLoaded, detectVerticalSquash, drawImageIOSFix, noop, without, + slice = [].slice, + extend1 = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + noop = function() {}; + + Emitter = (function() { + function Emitter() {} + + Emitter.prototype.addEventListener = Emitter.prototype.on; + + Emitter.prototype.on = function(event, fn) { + this._callbacks = this._callbacks || {}; + if (!this._callbacks[event]) { + this._callbacks[event] = []; + } + this._callbacks[event].push(fn); + return this; + }; + + Emitter.prototype.emit = function() { + var args, callback, callbacks, event, j, len; + event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; + this._callbacks = this._callbacks || {}; + callbacks = this._callbacks[event]; + if (callbacks) { + for (j = 0, len = callbacks.length; j < len; j++) { + callback = callbacks[j]; + callback.apply(this, args); + } + } + return this; + }; + + Emitter.prototype.removeListener = Emitter.prototype.off; + + Emitter.prototype.removeAllListeners = Emitter.prototype.off; + + Emitter.prototype.removeEventListener = Emitter.prototype.off; + + Emitter.prototype.off = function(event, fn) { + var callback, callbacks, i, j, len; + if (!this._callbacks || arguments.length === 0) { + this._callbacks = {}; + return this; + } + callbacks = this._callbacks[event]; + if (!callbacks) { + return this; + } + if (arguments.length === 1) { + delete this._callbacks[event]; + return this; + } + for (i = j = 0, len = callbacks.length; j < len; i = ++j) { + callback = callbacks[i]; + if (callback === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; + }; + + return Emitter; + + })(); + + Dropzone = (function(superClass) { + var extend, resolveOption; + + extend1(Dropzone, superClass); + + Dropzone.prototype.Emitter = Emitter; + + + /* + This is a list of all available events you can register on a dropzone object. + + You can register an event handler like this: + + dropzone.on("dragEnter", function() { }); + */ + + Dropzone.prototype.events = ["drop", "dragstart", "dragend", "dragenter", "dragover", "dragleave", "addedfile", "addedfiles", "removedfile", "thumbnail", "error", "errormultiple", "processing", "processingmultiple", "uploadprogress", "totaluploadprogress", "sending", "sendingmultiple", "success", "successmultiple", "canceled", "canceledmultiple", "complete", "completemultiple", "reset", "maxfilesexceeded", "maxfilesreached", "queuecomplete"]; + + Dropzone.prototype.defaultOptions = { + url: null, + method: "post", + withCredentials: false, + timeout: 30000, + parallelUploads: 2, + uploadMultiple: false, + maxFilesize: 1024, + paramName: "file", + createImageThumbnails: true, + maxThumbnailFilesize: 10, + thumbnailWidth: 120, + thumbnailHeight: 120, + thumbnailMethod: 'crop', + resizeWidth: null, + resizeHeight: null, + resizeMimeType: null, + resizeQuality: 0.8, + resizeMethod: 'contain', + filesizeBase: 1000, + maxFiles: null, + params: {}, + headers: null, + clickable: true, + ignoreHiddenFiles: true, + acceptedFiles: null, + acceptedMimeTypes: null, + autoProcessQueue: true, + autoQueue: true, + addRemoveLinks: false, + previewsContainer: null, + hiddenInputContainer: "body", + capture: null, + renameFilename: null, + renameFile: null, + forceFallback: false, + dictDefaultMessage: "Click here to choose a file or drag it here to upload", + dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.", + dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.", + dictFileTooBig: "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.", + dictInvalidFileType: "You can't upload files of this type.", + dictResponseError: "Server responded with {{statusCode}} code.", + dictCancelUpload: "Cancel upload", + dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?", + dictRemoveFile: "Remove file", + dictRemoveFileConfirmation: null, + dictMaxFilesExceeded: "You can not upload any more files.", + dictFileSizeUnits: { + tb: "TB", + gb: "GB", + mb: "MB", + kb: "KB", + b: "b" + }, + init: function() { + return noop; + }, + accept: function(file, done) { + return done(); + }, + fallback: function() { + var child, j, len, messageElement, ref, span; + this.element.className = this.element.className + " dz-browser-not-supported"; + ref = this.element.getElementsByTagName("div"); + for (j = 0, len = ref.length; j < len; j++) { + child = ref[j]; + if (/(^| )dz-message($| )/.test(child.className)) { + messageElement = child; + child.className = "dz-message"; + continue; + } + } + if (!messageElement) { + messageElement = Dropzone.createElement("
"); + this.element.appendChild(messageElement); + } + span = messageElement.getElementsByTagName("span")[0]; + if (span) { + if (span.textContent != null) { + span.textContent = this.options.dictFallbackMessage; + } else if (span.innerText != null) { + span.innerText = this.options.dictFallbackMessage; + } + } + return this.element.appendChild(this.getFallbackForm()); + }, + resize: function(file, width, height, resizeMethod) { + var info, srcRatio, trgRatio; + info = { + srcX: 0, + srcY: 0, + srcWidth: file.width, + srcHeight: file.height + }; + srcRatio = file.width / file.height; + if ((width == null) && (height == null)) { + width = info.srcWidth; + height = info.srcHeight; + } else if (width == null) { + width = height * srcRatio; + } else if (height == null) { + height = width / srcRatio; + } + width = Math.min(width, info.srcWidth); + height = Math.min(height, info.srcHeight); + trgRatio = width / height; + if (info.srcWidth > width || info.srcHeight > height) { + if (resizeMethod === 'crop') { + if (srcRatio > trgRatio) { + info.srcHeight = file.height; + info.srcWidth = info.srcHeight * trgRatio; + } else { + info.srcWidth = file.width; + info.srcHeight = info.srcWidth / trgRatio; + } + } else if (resizeMethod === 'contain') { + if (srcRatio > trgRatio) { + height = width / srcRatio; + } else { + width = height * srcRatio; + } + } else { + throw new Error("Unknown resizeMethod '" + resizeMethod + "'"); + } + } + info.srcX = (file.width - info.srcWidth) / 2; + info.srcY = (file.height - info.srcHeight) / 2; + info.trgWidth = width; + info.trgHeight = height; + return info; + }, + transformFile: function(file, done) { + if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) { + return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done); + } else { + return done(file); + } + }, + previewTemplate: "
\n
\n
\n
\n
\n
\n
\n
\n
\n \n Check\n \n \n \n \n \n
\n
\n \n Error\n \n \n \n \n \n \n \n
\n
", + + /* + Those functions register themselves to the events on init and handle all + the user interface specific stuff. Overwriting them won't break the upload + but can break the way it's displayed. + You can overwrite them if you don't like the default behavior. If you just + want to add an additional event handler, register it on the dropzone object + and don't overwrite those options. + */ + drop: function(e) { + return this.element.classList.remove("dz-drag-hover"); + }, + dragstart: noop, + dragend: function(e) { + return this.element.classList.remove("dz-drag-hover"); + }, + dragenter: function(e) { + return this.element.classList.add("dz-drag-hover"); + }, + dragover: function(e) { + return this.element.classList.add("dz-drag-hover"); + }, + dragleave: function(e) { + return this.element.classList.remove("dz-drag-hover"); + }, + paste: noop, + reset: function() { + return this.element.classList.remove("dz-started"); + }, + addedfile: function(file) { + var j, k, l, len, len1, len2, node, ref, ref1, ref2, removeFileEvent, removeLink, results; + if (this.element === this.previewsContainer) { + this.element.classList.add("dz-started"); + } + if (this.previewsContainer) { + file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim()); + file.previewTemplate = file.previewElement; + this.previewsContainer.appendChild(file.previewElement); + ref = file.previewElement.querySelectorAll("[data-dz-name]"); + for (j = 0, len = ref.length; j < len; j++) { + node = ref[j]; + node.textContent = file.name; + } + ref1 = file.previewElement.querySelectorAll("[data-dz-size]"); + for (k = 0, len1 = ref1.length; k < len1; k++) { + node = ref1[k]; + node.innerHTML = this.filesize(file.size); + } + if (this.options.addRemoveLinks) { + file._removeLink = Dropzone.createElement("" + this.options.dictRemoveFile + ""); + file.previewElement.appendChild(file._removeLink); + } + removeFileEvent = (function(_this) { + return function(e) { + e.preventDefault(); + e.stopPropagation(); + if (file.status === Dropzone.UPLOADING) { + return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function() { + return _this.removeFile(file); + }); + } else { + if (_this.options.dictRemoveFileConfirmation) { + return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function() { + return _this.removeFile(file); + }); + } else { + return _this.removeFile(file); + } + } + }; + })(this); + ref2 = file.previewElement.querySelectorAll("[data-dz-remove]"); + results = []; + for (l = 0, len2 = ref2.length; l < len2; l++) { + removeLink = ref2[l]; + results.push(removeLink.addEventListener("click", removeFileEvent)); + } + return results; + } + }, + removedfile: function(file) { + var ref; + if (file.previewElement) { + if ((ref = file.previewElement) != null) { + ref.parentNode.removeChild(file.previewElement); + } + } + return this._updateMaxFilesReachedClass(); + }, + thumbnail: function(file, dataUrl) { + var j, len, ref, thumbnailElement; + if (file.previewElement) { + file.previewElement.classList.remove("dz-file-preview"); + ref = file.previewElement.querySelectorAll("[data-dz-thumbnail]"); + for (j = 0, len = ref.length; j < len; j++) { + thumbnailElement = ref[j]; + thumbnailElement.alt = file.name; + thumbnailElement.src = dataUrl; + } + return setTimeout(((function(_this) { + return function() { + return file.previewElement.classList.add("dz-image-preview"); + }; + })(this)), 1); + } + }, + error: function(file, message) { + var j, len, node, ref, results; + if (file.previewElement) { + file.previewElement.classList.add("dz-error"); + if (typeof message !== "String" && message.error) { + message = message.error; + } + ref = file.previewElement.querySelectorAll("[data-dz-errormessage]"); + results = []; + for (j = 0, len = ref.length; j < len; j++) { + node = ref[j]; + results.push(node.textContent = message); + } + return results; + } + }, + errormultiple: noop, + processing: function(file) { + if (file.previewElement) { + file.previewElement.classList.add("dz-processing"); + if (file._removeLink) { + return file._removeLink.textContent = this.options.dictCancelUpload; + } + } + }, + processingmultiple: noop, + uploadprogress: function(file, progress, bytesSent) { + var j, len, node, ref, results; + if (file.previewElement) { + ref = file.previewElement.querySelectorAll("[data-dz-uploadprogress]"); + results = []; + for (j = 0, len = ref.length; j < len; j++) { + node = ref[j]; + if (node.nodeName === 'PROGRESS') { + results.push(node.value = progress); + } else { + results.push(node.style.width = progress + "%"); + } + } + return results; + } + }, + totaluploadprogress: noop, + sending: noop, + sendingmultiple: noop, + success: function(file) { + if (file.previewElement) { + return file.previewElement.classList.add("dz-success"); + } + }, + successmultiple: noop, + canceled: function(file) { + return this.emit("error", file, "Upload canceled."); + }, + canceledmultiple: noop, + complete: function(file) { + if (file._removeLink) { + file._removeLink.textContent = this.options.dictRemoveFile; + } + if (file.previewElement) { + return file.previewElement.classList.add("dz-complete"); + } + }, + completemultiple: noop, + maxfilesexceeded: noop, + maxfilesreached: noop, + queuecomplete: noop, + addedfiles: noop + }; + + extend = function() { + var j, key, len, object, objects, target, val; + target = arguments[0], objects = 2 <= arguments.length ? slice.call(arguments, 1) : []; + for (j = 0, len = objects.length; j < len; j++) { + object = objects[j]; + for (key in object) { + val = object[key]; + target[key] = val; + } + } + return target; + }; + + function Dropzone(element1, options) { + var elementOptions, fallback, ref; + this.element = element1; + this.version = Dropzone.version; + this.defaultOptions.previewTemplate = this.defaultOptions.previewTemplate.replace(/\n*/g, ""); + this.clickableElements = []; + this.listeners = []; + this.files = []; + if (typeof this.element === "string") { + this.element = document.querySelector(this.element); + } + if (!(this.element && (this.element.nodeType != null))) { + throw new Error("Invalid dropzone element."); + } + if (this.element.dropzone) { + throw new Error("Dropzone already attached."); + } + Dropzone.instances.push(this); + this.element.dropzone = this; + elementOptions = (ref = Dropzone.optionsForElement(this.element)) != null ? ref : {}; + this.options = extend({}, this.defaultOptions, elementOptions, options != null ? options : {}); + if (this.options.forceFallback || !Dropzone.isBrowserSupported()) { + return this.options.fallback.call(this); + } + if (this.options.url == null) { + this.options.url = this.element.getAttribute("action"); + } + if (!this.options.url) { + throw new Error("No URL provided."); + } + if (this.options.acceptedFiles && this.options.acceptedMimeTypes) { + throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated."); + } + if (this.options.acceptedMimeTypes) { + this.options.acceptedFiles = this.options.acceptedMimeTypes; + delete this.options.acceptedMimeTypes; + } + if (this.options.renameFilename != null) { + this.options.renameFile = (function(_this) { + return function(file) { + return _this.options.renameFilename.call(_this, file.name, file); + }; + })(this); + } + this.options.method = this.options.method.toUpperCase(); + if ((fallback = this.getExistingFallback()) && fallback.parentNode) { + fallback.parentNode.removeChild(fallback); + } + if (this.options.previewsContainer !== false) { + if (this.options.previewsContainer) { + this.previewsContainer = Dropzone.getElement(this.options.previewsContainer, "previewsContainer"); + } else { + this.previewsContainer = this.element; + } + } + if (this.options.clickable) { + if (this.options.clickable === true) { + this.clickableElements = [this.element]; + } else { + this.clickableElements = Dropzone.getElements(this.options.clickable, "clickable"); + } + } + this.init(); + } + + Dropzone.prototype.getAcceptedFiles = function() { + var file, j, len, ref, results; + ref = this.files; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + if (file.accepted) { + results.push(file); + } + } + return results; + }; + + Dropzone.prototype.getRejectedFiles = function() { + var file, j, len, ref, results; + ref = this.files; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + if (!file.accepted) { + results.push(file); + } + } + return results; + }; + + Dropzone.prototype.getFilesWithStatus = function(status) { + var file, j, len, ref, results; + ref = this.files; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + if (file.status === status) { + results.push(file); + } + } + return results; + }; + + Dropzone.prototype.getQueuedFiles = function() { + return this.getFilesWithStatus(Dropzone.QUEUED); + }; + + Dropzone.prototype.getUploadingFiles = function() { + return this.getFilesWithStatus(Dropzone.UPLOADING); + }; + + Dropzone.prototype.getAddedFiles = function() { + return this.getFilesWithStatus(Dropzone.ADDED); + }; + + Dropzone.prototype.getActiveFiles = function() { + var file, j, len, ref, results; + ref = this.files; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + if (file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED) { + results.push(file); + } + } + return results; + }; + + Dropzone.prototype.init = function() { + var eventName, j, len, noPropagation, ref, ref1, setupHiddenFileInput; + if (this.element.tagName === "form") { + this.element.setAttribute("enctype", "multipart/form-data"); + } + if (this.element.classList.contains("dropzone") && !this.element.querySelector(".dz-message")) { + this.element.appendChild(Dropzone.createElement("

" + this.options.dictDefaultMessage + "

")); + } + if (this.clickableElements.length) { + setupHiddenFileInput = (function(_this) { + return function() { + if (_this.hiddenFileInput) { + _this.hiddenFileInput.parentNode.removeChild(_this.hiddenFileInput); + } + _this.hiddenFileInput = document.createElement("input"); + _this.hiddenFileInput.setAttribute("type", "file"); + if ((_this.options.maxFiles == null) || _this.options.maxFiles > 1) { + _this.hiddenFileInput.setAttribute("multiple", "multiple"); + } + _this.hiddenFileInput.className = "dz-hidden-input"; + if (_this.options.acceptedFiles != null) { + _this.hiddenFileInput.setAttribute("accept", _this.options.acceptedFiles); + } + if (_this.options.capture != null) { + _this.hiddenFileInput.setAttribute("capture", _this.options.capture); + } + _this.hiddenFileInput.style.visibility = "hidden"; + _this.hiddenFileInput.style.position = "absolute"; + _this.hiddenFileInput.style.top = "0"; + _this.hiddenFileInput.style.left = "0"; + _this.hiddenFileInput.style.height = "0"; + _this.hiddenFileInput.style.width = "0"; + document.querySelector(_this.options.hiddenInputContainer).appendChild(_this.hiddenFileInput); + return _this.hiddenFileInput.addEventListener("change", function() { + var file, files, j, len; + files = _this.hiddenFileInput.files; + if (files.length) { + for (j = 0, len = files.length; j < len; j++) { + file = files[j]; + _this.addFile(file); + } + } + _this.emit("addedfiles", files); + return setupHiddenFileInput(); + }); + }; + })(this); + setupHiddenFileInput(); + } + this.URL = (ref = window.URL) != null ? ref : window.webkitURL; + ref1 = this.events; + for (j = 0, len = ref1.length; j < len; j++) { + eventName = ref1[j]; + this.on(eventName, this.options[eventName]); + } + this.on("uploadprogress", (function(_this) { + return function() { + return _this.updateTotalUploadProgress(); + }; + })(this)); + this.on("removedfile", (function(_this) { + return function() { + return _this.updateTotalUploadProgress(); + }; + })(this)); + this.on("canceled", (function(_this) { + return function(file) { + return _this.emit("complete", file); + }; + })(this)); + this.on("complete", (function(_this) { + return function(file) { + if (_this.getAddedFiles().length === 0 && _this.getUploadingFiles().length === 0 && _this.getQueuedFiles().length === 0) { + return setTimeout((function() { + return _this.emit("queuecomplete"); + }), 0); + } + }; + })(this)); + noPropagation = function(e) { + e.stopPropagation(); + if (e.preventDefault) { + return e.preventDefault(); + } else { + return e.returnValue = false; + } + }; + this.listeners = [ + { + element: this.element, + events: { + "dragstart": (function(_this) { + return function(e) { + return _this.emit("dragstart", e); + }; + })(this), + "dragenter": (function(_this) { + return function(e) { + noPropagation(e); + return _this.emit("dragenter", e); + }; + })(this), + "dragover": (function(_this) { + return function(e) { + var efct; + try { + efct = e.dataTransfer.effectAllowed; + } catch (undefined) {} + e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy'; + noPropagation(e); + return _this.emit("dragover", e); + }; + })(this), + "dragleave": (function(_this) { + return function(e) { + return _this.emit("dragleave", e); + }; + })(this), + "drop": (function(_this) { + return function(e) { + noPropagation(e); + return _this.drop(e); + }; + })(this), + "dragend": (function(_this) { + return function(e) { + return _this.emit("dragend", e); + }; + })(this) + } + } + ]; + this.clickableElements.forEach((function(_this) { + return function(clickableElement) { + return _this.listeners.push({ + element: clickableElement, + events: { + "click": function(evt) { + if ((clickableElement !== _this.element) || (evt.target === _this.element || Dropzone.elementInside(evt.target, _this.element.querySelector(".dz-message")))) { + _this.hiddenFileInput.click(); + } + return true; + } + } + }); + }; + })(this)); + this.enable(); + return this.options.init.call(this); + }; + + Dropzone.prototype.destroy = function() { + var ref; + this.disable(); + this.removeAllFiles(true); + if ((ref = this.hiddenFileInput) != null ? ref.parentNode : void 0) { + this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput); + this.hiddenFileInput = null; + } + delete this.element.dropzone; + return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1); + }; + + Dropzone.prototype.updateTotalUploadProgress = function() { + var activeFiles, file, j, len, ref, totalBytes, totalBytesSent, totalUploadProgress; + totalBytesSent = 0; + totalBytes = 0; + activeFiles = this.getActiveFiles(); + if (activeFiles.length) { + ref = this.getActiveFiles(); + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + totalBytesSent += file.upload.bytesSent; + totalBytes += file.upload.total; + } + totalUploadProgress = 100 * totalBytesSent / totalBytes; + } else { + totalUploadProgress = 100; + } + return this.emit("totaluploadprogress", totalUploadProgress, totalBytes, totalBytesSent); + }; + + Dropzone.prototype._getParamName = function(n) { + if (typeof this.options.paramName === "function") { + return this.options.paramName(n); + } else { + return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : ""); + } + }; + + Dropzone.prototype._renameFile = function(file) { + if (typeof this.options.renameFile !== "function") { + return file.name; + } + return this.options.renameFile(file); + }; + + Dropzone.prototype.getFallbackForm = function() { + var existingFallback, fields, fieldsString, form; + if (existingFallback = this.getExistingFallback()) { + return existingFallback; + } + fieldsString = "
"; + if (this.options.dictFallbackText) { + fieldsString += "

" + this.options.dictFallbackText + "

"; + } + fieldsString += "
"; + fields = Dropzone.createElement(fieldsString); + if (this.element.tagName !== "FORM") { + form = Dropzone.createElement("
"); + form.appendChild(fields); + } else { + this.element.setAttribute("enctype", "multipart/form-data"); + this.element.setAttribute("method", this.options.method); + } + return form != null ? form : fields; + }; + + Dropzone.prototype.getExistingFallback = function() { + var fallback, getFallback, j, len, ref, tagName; + getFallback = function(elements) { + var el, j, len; + for (j = 0, len = elements.length; j < len; j++) { + el = elements[j]; + if (/(^| )fallback($| )/.test(el.className)) { + return el; + } + } + }; + ref = ["div", "form"]; + for (j = 0, len = ref.length; j < len; j++) { + tagName = ref[j]; + if (fallback = getFallback(this.element.getElementsByTagName(tagName))) { + return fallback; + } + } + }; + + Dropzone.prototype.setupEventListeners = function() { + var elementListeners, event, j, len, listener, ref, results; + ref = this.listeners; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + elementListeners = ref[j]; + results.push((function() { + var ref1, results1; + ref1 = elementListeners.events; + results1 = []; + for (event in ref1) { + listener = ref1[event]; + results1.push(elementListeners.element.addEventListener(event, listener, false)); + } + return results1; + })()); + } + return results; + }; + + Dropzone.prototype.removeEventListeners = function() { + var elementListeners, event, j, len, listener, ref, results; + ref = this.listeners; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + elementListeners = ref[j]; + results.push((function() { + var ref1, results1; + ref1 = elementListeners.events; + results1 = []; + for (event in ref1) { + listener = ref1[event]; + results1.push(elementListeners.element.removeEventListener(event, listener, false)); + } + return results1; + })()); + } + return results; + }; + + Dropzone.prototype.disable = function() { + var file, j, len, ref, results; + this.clickableElements.forEach(function(element) { + return element.classList.remove("dz-clickable"); + }); + this.removeEventListeners(); + ref = this.files; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + results.push(this.cancelUpload(file)); + } + return results; + }; + + Dropzone.prototype.enable = function() { + this.clickableElements.forEach(function(element) { + return element.classList.add("dz-clickable"); + }); + return this.setupEventListeners(); + }; + + Dropzone.prototype.filesize = function(size) { + var cutoff, i, j, len, selectedSize, selectedUnit, unit, units; + selectedSize = 0; + selectedUnit = "b"; + if (size > 0) { + units = ['tb', 'gb', 'mb', 'kb', 'b']; + for (i = j = 0, len = units.length; j < len; i = ++j) { + unit = units[i]; + cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10; + if (size >= cutoff) { + selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i); + selectedUnit = unit; + break; + } + } + selectedSize = Math.round(10 * selectedSize) / 10; + } + return "" + selectedSize + " " + this.options.dictFileSizeUnits[selectedUnit]; + }; + + Dropzone.prototype._updateMaxFilesReachedClass = function() { + if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) { + if (this.getAcceptedFiles().length === this.options.maxFiles) { + this.emit('maxfilesreached', this.files); + } + return this.element.classList.add("dz-max-files-reached"); + } else { + return this.element.classList.remove("dz-max-files-reached"); + } + }; + + Dropzone.prototype.drop = function(e) { + var files, items; + if (!e.dataTransfer) { + return; + } + this.emit("drop", e); + files = e.dataTransfer.files; + this.emit("addedfiles", files); + if (files.length) { + items = e.dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry != null)) { + this._addFilesFromItems(items); + } else { + this.handleFiles(files); + } + } + }; + + Dropzone.prototype.paste = function(e) { + var items, ref; + if ((e != null ? (ref = e.clipboardData) != null ? ref.items : void 0 : void 0) == null) { + return; + } + this.emit("paste", e); + items = e.clipboardData.items; + if (items.length) { + return this._addFilesFromItems(items); + } + }; + + Dropzone.prototype.handleFiles = function(files) { + var file, j, len, results; + results = []; + for (j = 0, len = files.length; j < len; j++) { + file = files[j]; + results.push(this.addFile(file)); + } + return results; + }; + + Dropzone.prototype._addFilesFromItems = function(items) { + var entry, item, j, len, results; + results = []; + for (j = 0, len = items.length; j < len; j++) { + item = items[j]; + if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) { + if (entry.isFile) { + results.push(this.addFile(item.getAsFile())); + } else if (entry.isDirectory) { + results.push(this._addFilesFromDirectory(entry, entry.name)); + } else { + results.push(void 0); + } + } else if (item.getAsFile != null) { + if ((item.kind == null) || item.kind === "file") { + results.push(this.addFile(item.getAsFile())); + } else { + results.push(void 0); + } + } else { + results.push(void 0); + } + } + return results; + }; + + Dropzone.prototype._addFilesFromDirectory = function(directory, path) { + var dirReader, errorHandler, readEntries; + dirReader = directory.createReader(); + errorHandler = function(error) { + return typeof console !== "undefined" && console !== null ? typeof console.log === "function" ? console.log(error) : void 0 : void 0; + }; + readEntries = (function(_this) { + return function() { + return dirReader.readEntries(function(entries) { + var entry, j, len; + if (entries.length > 0) { + for (j = 0, len = entries.length; j < len; j++) { + entry = entries[j]; + if (entry.isFile) { + entry.file(function(file) { + if (_this.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') { + return; + } + file.fullPath = path + "/" + file.name; + return _this.addFile(file); + }); + } else if (entry.isDirectory) { + _this._addFilesFromDirectory(entry, path + "/" + entry.name); + } + } + readEntries(); + } + return null; + }, errorHandler); + }; + })(this); + return readEntries(); + }; + + Dropzone.prototype.accept = function(file, done) { + if (file.size > this.options.maxFilesize * 1024 * 1024) { + return done(this.options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", this.options.maxFilesize)); + } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) { + return done(this.options.dictInvalidFileType); + } else if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) { + done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}", this.options.maxFiles)); + return this.emit("maxfilesexceeded", file); + } else { + return this.options.accept.call(this, file, done); + } + }; + + Dropzone.prototype.addFile = function(file) { + file.upload = { + progress: 0, + total: file.size, + bytesSent: 0, + filename: this._renameFile(file) + }; + this.files.push(file); + file.status = Dropzone.ADDED; + this.emit("addedfile", file); + this._enqueueThumbnail(file); + return this.accept(file, (function(_this) { + return function(error) { + if (error) { + file.accepted = false; + _this._errorProcessing([file], error); + } else { + file.accepted = true; + if (_this.options.autoQueue) { + _this.enqueueFile(file); + } + } + return _this._updateMaxFilesReachedClass(); + }; + })(this)); + }; + + Dropzone.prototype.enqueueFiles = function(files) { + var file, j, len; + for (j = 0, len = files.length; j < len; j++) { + file = files[j]; + this.enqueueFile(file); + } + return null; + }; + + Dropzone.prototype.enqueueFile = function(file) { + if (file.status === Dropzone.ADDED && file.accepted === true) { + file.status = Dropzone.QUEUED; + if (this.options.autoProcessQueue) { + return setTimeout(((function(_this) { + return function() { + return _this.processQueue(); + }; + })(this)), 0); + } + } else { + throw new Error("This file can't be queued because it has already been processed or was rejected."); + } + }; + + Dropzone.prototype._thumbnailQueue = []; + + Dropzone.prototype._processingThumbnail = false; + + Dropzone.prototype._enqueueThumbnail = function(file) { + if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) { + this._thumbnailQueue.push(file); + return setTimeout(((function(_this) { + return function() { + return _this._processThumbnailQueue(); + }; + })(this)), 0); + } + }; + + Dropzone.prototype._processThumbnailQueue = function() { + var file; + if (this._processingThumbnail || this._thumbnailQueue.length === 0) { + return; + } + this._processingThumbnail = true; + file = this._thumbnailQueue.shift(); + return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, (function(_this) { + return function(dataUrl) { + _this.emit("thumbnail", file, dataUrl); + _this._processingThumbnail = false; + return _this._processThumbnailQueue(); + }; + })(this)); + }; + + Dropzone.prototype.removeFile = function(file) { + if (file.status === Dropzone.UPLOADING) { + this.cancelUpload(file); + } + this.files = without(this.files, file); + this.emit("removedfile", file); + if (this.files.length === 0) { + return this.emit("reset"); + } + }; + + Dropzone.prototype.removeAllFiles = function(cancelIfNecessary) { + var file, j, len, ref; + if (cancelIfNecessary == null) { + cancelIfNecessary = false; + } + ref = this.files.slice(); + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) { + this.removeFile(file); + } + } + return null; + }; + + Dropzone.prototype.resizeImage = function(file, width, height, resizeMethod, callback) { + return this.createThumbnail(file, width, height, resizeMethod, false, (function(_this) { + return function(dataUrl, canvas) { + var resizeMimeType, resizedDataURL; + if (canvas === null) { + return callback(file); + } else { + resizeMimeType = _this.options.resizeMimeType; + if (resizeMimeType == null) { + resizeMimeType = file.type; + } + resizedDataURL = canvas.toDataURL(resizeMimeType, _this.options.resizeQuality); + if (resizeMimeType === 'image/jpeg' || resizeMimeType === 'image/jpg') { + resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL); + } + return callback(Dropzone.dataURItoBlob(resizedDataURL)); + } + }; + })(this)); + }; + + Dropzone.prototype.createThumbnail = function(file, width, height, resizeMethod, fixOrientation, callback) { + var fileReader; + fileReader = new FileReader; + fileReader.onload = (function(_this) { + return function() { + file.dataURL = fileReader.result; + if (file.type === "image/svg+xml") { + if (callback != null) { + callback(fileReader.result); + } + return; + } + return _this.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback); + }; + })(this); + return fileReader.readAsDataURL(file); + }; + + Dropzone.prototype.createThumbnailFromUrl = function(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) { + var img; + img = document.createElement("img"); + if (crossOrigin) { + img.crossOrigin = crossOrigin; + } + img.onload = (function(_this) { + return function() { + var loadExif; + loadExif = function(callback) { + return callback(1); + }; + if ((typeof EXIF !== "undefined" && EXIF !== null) && fixOrientation) { + loadExif = function(callback) { + return EXIF.getData(img, function() { + return callback(EXIF.getTag(this, 'Orientation')); + }); + }; + } + return loadExif(function(orientation) { + var canvas, ctx, ref, ref1, ref2, ref3, resizeInfo, thumbnail; + file.width = img.width; + file.height = img.height; + resizeInfo = _this.options.resize.call(_this, file, width, height, resizeMethod); + canvas = document.createElement("canvas"); + ctx = canvas.getContext("2d"); + canvas.width = resizeInfo.trgWidth; + canvas.height = resizeInfo.trgHeight; + if (orientation > 4) { + canvas.width = resizeInfo.trgHeight; + canvas.height = resizeInfo.trgWidth; + } + switch (orientation) { + case 2: + ctx.translate(canvas.width, 0); + ctx.scale(-1, 1); + break; + case 3: + ctx.translate(canvas.width, canvas.height); + ctx.rotate(Math.PI); + break; + case 4: + ctx.translate(0, canvas.height); + ctx.scale(1, -1); + break; + case 5: + ctx.rotate(0.5 * Math.PI); + ctx.scale(1, -1); + break; + case 6: + ctx.rotate(0.5 * Math.PI); + ctx.translate(0, -canvas.height); + break; + case 7: + ctx.rotate(0.5 * Math.PI); + ctx.translate(canvas.width, -canvas.height); + ctx.scale(-1, 1); + break; + case 8: + ctx.rotate(-0.5 * Math.PI); + ctx.translate(-canvas.width, 0); + } + drawImageIOSFix(ctx, img, (ref = resizeInfo.srcX) != null ? ref : 0, (ref1 = resizeInfo.srcY) != null ? ref1 : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, (ref2 = resizeInfo.trgX) != null ? ref2 : 0, (ref3 = resizeInfo.trgY) != null ? ref3 : 0, resizeInfo.trgWidth, resizeInfo.trgHeight); + thumbnail = canvas.toDataURL("image/png"); + if (callback != null) { + return callback(thumbnail, canvas); + } + }); + }; + })(this); + if (callback != null) { + img.onerror = callback; + } + return img.src = file.dataURL; + }; + + Dropzone.prototype.processQueue = function() { + var i, parallelUploads, processingLength, queuedFiles; + parallelUploads = this.options.parallelUploads; + processingLength = this.getUploadingFiles().length; + i = processingLength; + if (processingLength >= parallelUploads) { + return; + } + queuedFiles = this.getQueuedFiles(); + if (!(queuedFiles.length > 0)) { + return; + } + if (this.options.uploadMultiple) { + return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength)); + } else { + while (i < parallelUploads) { + if (!queuedFiles.length) { + return; + } + this.processFile(queuedFiles.shift()); + i++; + } + } + }; + + Dropzone.prototype.processFile = function(file) { + return this.processFiles([file]); + }; + + Dropzone.prototype.processFiles = function(files) { + var file, j, len; + for (j = 0, len = files.length; j < len; j++) { + file = files[j]; + file.processing = true; + file.status = Dropzone.UPLOADING; + this.emit("processing", file); + } + if (this.options.uploadMultiple) { + this.emit("processingmultiple", files); + } + return this.uploadFiles(files); + }; + + Dropzone.prototype._getFilesWithXhr = function(xhr) { + var file, files; + return files = (function() { + var j, len, ref, results; + ref = this.files; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + file = ref[j]; + if (file.xhr === xhr) { + results.push(file); + } + } + return results; + }).call(this); + }; + + Dropzone.prototype.cancelUpload = function(file) { + var groupedFile, groupedFiles, j, k, len, len1, ref; + if (file.status === Dropzone.UPLOADING) { + groupedFiles = this._getFilesWithXhr(file.xhr); + for (j = 0, len = groupedFiles.length; j < len; j++) { + groupedFile = groupedFiles[j]; + groupedFile.status = Dropzone.CANCELED; + } + file.xhr.abort(); + for (k = 0, len1 = groupedFiles.length; k < len1; k++) { + groupedFile = groupedFiles[k]; + this.emit("canceled", groupedFile); + } + if (this.options.uploadMultiple) { + this.emit("canceledmultiple", groupedFiles); + } + } else if ((ref = file.status) === Dropzone.ADDED || ref === Dropzone.QUEUED) { + file.status = Dropzone.CANCELED; + this.emit("canceled", file); + if (this.options.uploadMultiple) { + this.emit("canceledmultiple", [file]); + } + } + if (this.options.autoProcessQueue) { + return this.processQueue(); + } + }; + + resolveOption = function() { + var args, option; + option = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; + if (typeof option === 'function') { + return option.apply(this, args); + } + return option; + }; + + Dropzone.prototype.uploadFile = function(file) { + return this.uploadFiles([file]); + }; + + Dropzone.prototype.uploadFiles = function(files) { + var doneCounter, doneFunction, file, formData, handleError, headerName, headerValue, headers, i, input, inputName, inputType, j, k, key, l, len, len1, len2, len3, m, method, o, option, progressObj, ref, ref1, ref2, ref3, ref4, ref5, response, results, updateProgress, url, value, xhr; + xhr = new XMLHttpRequest(); + for (j = 0, len = files.length; j < len; j++) { + file = files[j]; + file.xhr = xhr; + } + method = resolveOption(this.options.method, files); + url = resolveOption(this.options.url, files); + xhr.open(method, url, true); + xhr.timeout = resolveOption(this.options.timeout, files); + xhr.withCredentials = !!this.options.withCredentials; + response = null; + handleError = (function(_this) { + return function() { + var k, len1, results; + results = []; + for (k = 0, len1 = files.length; k < len1; k++) { + file = files[k]; + results.push(_this._errorProcessing(files, response || _this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr)); + } + return results; + }; + })(this); + updateProgress = (function(_this) { + return function(e) { + var allFilesFinished, k, l, len1, len2, len3, m, progress, results; + if (e != null) { + progress = 100 * e.loaded / e.total; + for (k = 0, len1 = files.length; k < len1; k++) { + file = files[k]; + file.upload.progress = progress; + file.upload.total = e.total; + file.upload.bytesSent = e.loaded; + } + } else { + allFilesFinished = true; + progress = 100; + for (l = 0, len2 = files.length; l < len2; l++) { + file = files[l]; + if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) { + allFilesFinished = false; + } + file.upload.progress = progress; + file.upload.bytesSent = file.upload.total; + } + if (allFilesFinished) { + return; + } + } + results = []; + for (m = 0, len3 = files.length; m < len3; m++) { + file = files[m]; + results.push(_this.emit("uploadprogress", file, progress, file.upload.bytesSent)); + } + return results; + }; + })(this); + xhr.onload = (function(_this) { + return function(e) { + var error1, ref; + if (files[0].status === Dropzone.CANCELED) { + return; + } + if (xhr.readyState !== 4) { + return; + } + if (xhr.responseType !== 'arraybuffer' && xhr.responseType !== 'blob') { + response = xhr.responseText; + if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) { + try { + response = JSON.parse(response); + } catch (error1) { + e = error1; + response = "Invalid JSON response from server."; + } + } + } + updateProgress(); + if (!((200 <= (ref = xhr.status) && ref < 300))) { + return handleError(); + } else { + return _this._finished(files, response, e); + } + }; + })(this); + xhr.onerror = (function(_this) { + return function() { + if (files[0].status === Dropzone.CANCELED) { + return; + } + return handleError(); + }; + })(this); + progressObj = (ref = xhr.upload) != null ? ref : xhr; + progressObj.onprogress = updateProgress; + headers = { + "Accept": "application/json", + "Cache-Control": "no-cache", + "X-Requested-With": "XMLHttpRequest" + }; + if (this.options.headers) { + extend(headers, this.options.headers); + } + for (headerName in headers) { + headerValue = headers[headerName]; + if (headerValue) { + xhr.setRequestHeader(headerName, headerValue); + } + } + formData = new FormData(); + if (this.options.params) { + ref1 = this.options.params; + for (key in ref1) { + value = ref1[key]; + formData.append(key, value); + } + } + for (k = 0, len1 = files.length; k < len1; k++) { + file = files[k]; + this.emit("sending", file, xhr, formData); + } + if (this.options.uploadMultiple) { + this.emit("sendingmultiple", files, xhr, formData); + } + if (this.element.tagName === "FORM") { + ref2 = this.element.querySelectorAll("input, textarea, select, button"); + for (l = 0, len2 = ref2.length; l < len2; l++) { + input = ref2[l]; + inputName = input.getAttribute("name"); + inputType = input.getAttribute("type"); + if (input.tagName === "SELECT" && input.hasAttribute("multiple")) { + ref3 = input.options; + for (m = 0, len3 = ref3.length; m < len3; m++) { + option = ref3[m]; + if (option.selected) { + formData.append(inputName, option.value); + } + } + } else if (!inputType || ((ref4 = inputType.toLowerCase()) !== "checkbox" && ref4 !== "radio") || input.checked) { + formData.append(inputName, input.value); + } + } + } + doneCounter = 0; + results = []; + for (i = o = 0, ref5 = files.length - 1; 0 <= ref5 ? o <= ref5 : o >= ref5; i = 0 <= ref5 ? ++o : --o) { + doneFunction = (function(_this) { + return function(file, paramName, fileName) { + return function(transformedFile) { + formData.append(paramName, transformedFile, fileName); + if (++doneCounter === files.length) { + return _this.submitRequest(xhr, formData, files); + } + }; + }; + })(this); + results.push(this.options.transformFile.call(this, files[i], doneFunction(files[i], this._getParamName(i), files[i].upload.filename))); + } + return results; + }; + + Dropzone.prototype.submitRequest = function(xhr, formData, files) { + return xhr.send(formData); + }; + + Dropzone.prototype._finished = function(files, responseText, e) { + var file, j, len; + for (j = 0, len = files.length; j < len; j++) { + file = files[j]; + file.status = Dropzone.SUCCESS; + this.emit("success", file, responseText, e); + this.emit("complete", file); + } + if (this.options.uploadMultiple) { + this.emit("successmultiple", files, responseText, e); + this.emit("completemultiple", files); + } + if (this.options.autoProcessQueue) { + return this.processQueue(); + } + }; + + Dropzone.prototype._errorProcessing = function(files, message, xhr) { + var file, j, len; + for (j = 0, len = files.length; j < len; j++) { + file = files[j]; + file.status = Dropzone.ERROR; + this.emit("error", file, message, xhr); + this.emit("complete", file); + } + if (this.options.uploadMultiple) { + this.emit("errormultiple", files, message, xhr); + this.emit("completemultiple", files); + } + if (this.options.autoProcessQueue) { + return this.processQueue(); + } + }; + + return Dropzone; + + })(Emitter); + + Dropzone.version = "5.1.1"; + + Dropzone.options = {}; + + Dropzone.optionsForElement = function(element) { + if (element.getAttribute("id")) { + return Dropzone.options[camelize(element.getAttribute("id"))]; + } else { + return void 0; + } + }; + + Dropzone.instances = []; + + Dropzone.forElement = function(element) { + if (typeof element === "string") { + element = document.querySelector(element); + } + if ((element != null ? element.dropzone : void 0) == null) { + throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone."); + } + return element.dropzone; + }; + + Dropzone.autoDiscover = true; + + Dropzone.discover = function() { + var checkElements, dropzone, dropzones, j, len, results; + if (document.querySelectorAll) { + dropzones = document.querySelectorAll(".dropzone"); + } else { + dropzones = []; + checkElements = function(elements) { + var el, j, len, results; + results = []; + for (j = 0, len = elements.length; j < len; j++) { + el = elements[j]; + if (/(^| )dropzone($| )/.test(el.className)) { + results.push(dropzones.push(el)); + } else { + results.push(void 0); + } + } + return results; + }; + checkElements(document.getElementsByTagName("div")); + checkElements(document.getElementsByTagName("form")); + } + results = []; + for (j = 0, len = dropzones.length; j < len; j++) { + dropzone = dropzones[j]; + if (Dropzone.optionsForElement(dropzone) !== false) { + results.push(new Dropzone(dropzone)); + } else { + results.push(void 0); + } + } + return results; + }; + + Dropzone.blacklistedBrowsers = [/opera.*Macintosh.*version\/12/i]; + + Dropzone.isBrowserSupported = function() { + var capableBrowser, j, len, ref, regex; + capableBrowser = true; + if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) { + if (!("classList" in document.createElement("a"))) { + capableBrowser = false; + } else { + ref = Dropzone.blacklistedBrowsers; + for (j = 0, len = ref.length; j < len; j++) { + regex = ref[j]; + if (regex.test(navigator.userAgent)) { + capableBrowser = false; + continue; + } + } + } + } else { + capableBrowser = false; + } + return capableBrowser; + }; + + Dropzone.dataURItoBlob = function(dataURI) { + var ab, byteString, i, ia, j, mimeString, ref; + byteString = atob(dataURI.split(',')[1]); + mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; + ab = new ArrayBuffer(byteString.length); + ia = new Uint8Array(ab); + for (i = j = 0, ref = byteString.length; 0 <= ref ? j <= ref : j >= ref; i = 0 <= ref ? ++j : --j) { + ia[i] = byteString.charCodeAt(i); + } + return new Blob([ab], { + type: mimeString + }); + }; + + without = function(list, rejectedItem) { + var item, j, len, results; + results = []; + for (j = 0, len = list.length; j < len; j++) { + item = list[j]; + if (item !== rejectedItem) { + results.push(item); + } + } + return results; + }; + + camelize = function(str) { + return str.replace(/[\-_](\w)/g, function(match) { + return match.charAt(1).toUpperCase(); + }); + }; + + Dropzone.createElement = function(string) { + var div; + div = document.createElement("div"); + div.innerHTML = string; + return div.childNodes[0]; + }; + + Dropzone.elementInside = function(element, container) { + if (element === container) { + return true; + } + while (element = element.parentNode) { + if (element === container) { + return true; + } + } + return false; + }; + + Dropzone.getElement = function(el, name) { + var element; + if (typeof el === "string") { + element = document.querySelector(el); + } else if (el.nodeType != null) { + element = el; + } + if (element == null) { + throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector or a plain HTML element."); + } + return element; + }; + + Dropzone.getElements = function(els, name) { + var e, el, elements, error1, j, k, len, len1, ref; + if (els instanceof Array) { + elements = []; + try { + for (j = 0, len = els.length; j < len; j++) { + el = els[j]; + elements.push(this.getElement(el, name)); + } + } catch (error1) { + e = error1; + elements = null; + } + } else if (typeof els === "string") { + elements = []; + ref = document.querySelectorAll(els); + for (k = 0, len1 = ref.length; k < len1; k++) { + el = ref[k]; + elements.push(el); + } + } else if (els.nodeType != null) { + elements = [els]; + } + if (!((elements != null) && elements.length)) { + throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector, a plain HTML element or a list of those."); + } + return elements; + }; + + Dropzone.confirm = function(question, accepted, rejected) { + if (window.confirm(question)) { + return accepted(); + } else if (rejected != null) { + return rejected(); + } + }; + + Dropzone.isValidFile = function(file, acceptedFiles) { + var baseMimeType, j, len, mimeType, validType; + if (!acceptedFiles) { + return true; + } + acceptedFiles = acceptedFiles.split(","); + mimeType = file.type; + baseMimeType = mimeType.replace(/\/.*$/, ""); + for (j = 0, len = acceptedFiles.length; j < len; j++) { + validType = acceptedFiles[j]; + validType = validType.trim(); + if (validType.charAt(0) === ".") { + if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) { + return true; + } + } else if (/\/\*$/.test(validType)) { + if (baseMimeType === validType.replace(/\/.*$/, "")) { + return true; + } + } else { + if (mimeType === validType) { + return true; + } + } + } + return false; + }; + + if (typeof jQuery !== "undefined" && jQuery !== null) { + jQuery.fn.dropzone = function(options) { + return this.each(function() { + return new Dropzone(this, options); + }); + }; + } + + if (typeof module !== "undefined" && module !== null) { + module.exports = Dropzone; + } else { + window.Dropzone = Dropzone; + } + + Dropzone.ADDED = "added"; + + Dropzone.QUEUED = "queued"; + + Dropzone.ACCEPTED = Dropzone.QUEUED; + + Dropzone.UPLOADING = "uploading"; + + Dropzone.PROCESSING = Dropzone.UPLOADING; + + Dropzone.CANCELED = "canceled"; + + Dropzone.ERROR = "error"; + + Dropzone.SUCCESS = "success"; + + + /* + + Bugfix for iOS 6 and 7 + Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios + based on the work of https://github.com/stomita/ios-imagefile-megapixel + */ + + detectVerticalSquash = function(img) { + var alpha, canvas, ctx, data, ey, ih, iw, py, ratio, sy; + iw = img.naturalWidth; + ih = img.naturalHeight; + canvas = document.createElement("canvas"); + canvas.width = 1; + canvas.height = ih; + ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + data = ctx.getImageData(1, 0, 1, ih).data; + sy = 0; + ey = ih; + py = ih; + while (py > sy) { + alpha = data[(py - 1) * 4 + 3]; + if (alpha === 0) { + ey = py; + } else { + sy = py; + } + py = (ey + sy) >> 1; + } + ratio = py / ih; + if (ratio === 0) { + return 1; + } else { + return ratio; + } + }; + + drawImageIOSFix = function(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) { + var vertSquashRatio; + vertSquashRatio = detectVerticalSquash(img); + return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio); + }; + + ExifRestore = (function() { + function ExifRestore() {} + + ExifRestore.KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + ExifRestore.encode64 = function(input) { + var chr1, chr2, chr3, enc1, enc2, enc3, enc4, i, output; + output = ''; + chr1 = void 0; + chr2 = void 0; + chr3 = ''; + enc1 = void 0; + enc2 = void 0; + enc3 = void 0; + enc4 = ''; + i = 0; + while (true) { + chr1 = input[i++]; + chr2 = input[i++]; + chr3 = input[i++]; + enc1 = chr1 >> 2; + enc2 = (chr1 & 3) << 4 | chr2 >> 4; + enc3 = (chr2 & 15) << 2 | chr3 >> 6; + enc4 = chr3 & 63; + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4); + chr1 = chr2 = chr3 = ''; + enc1 = enc2 = enc3 = enc4 = ''; + if (!(i < input.length)) { + break; + } + } + return output; + }; + + ExifRestore.restore = function(origFileBase64, resizedFileBase64) { + var image, rawImage, segments; + if (!origFileBase64.match('data:image/jpeg;base64,')) { + return resizedFileBase64; + } + rawImage = this.decode64(origFileBase64.replace('data:image/jpeg;base64,', '')); + segments = this.slice2Segments(rawImage); + image = this.exifManipulation(resizedFileBase64, segments); + return 'data:image/jpeg;base64,' + this.encode64(image); + }; + + ExifRestore.exifManipulation = function(resizedFileBase64, segments) { + var aBuffer, exifArray, newImageArray; + exifArray = this.getExifArray(segments); + newImageArray = this.insertExif(resizedFileBase64, exifArray); + aBuffer = new Uint8Array(newImageArray); + return aBuffer; + }; + + ExifRestore.getExifArray = function(segments) { + var seg, x; + seg = void 0; + x = 0; + while (x < segments.length) { + seg = segments[x]; + if (seg[0] === 255 & seg[1] === 225) { + return seg; + } + x++; + } + return []; + }; + + ExifRestore.insertExif = function(resizedFileBase64, exifArray) { + var array, ato, buf, imageData, mae, separatePoint; + imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''); + buf = this.decode64(imageData); + separatePoint = buf.indexOf(255, 3); + mae = buf.slice(0, separatePoint); + ato = buf.slice(separatePoint); + array = mae; + array = array.concat(exifArray); + array = array.concat(ato); + return array; + }; + + ExifRestore.slice2Segments = function(rawImageArray) { + var endPoint, head, length, seg, segments; + head = 0; + segments = []; + while (true) { + if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) { + break; + } + if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) { + head += 2; + } else { + length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3]; + endPoint = head + length + 2; + seg = rawImageArray.slice(head, endPoint); + segments.push(seg); + head = endPoint; + } + if (head > rawImageArray.length) { + break; + } + } + return segments; + }; + + ExifRestore.decode64 = function(input) { + var base64test, buf, chr1, chr2, chr3, enc1, enc2, enc3, enc4, i, output; + output = ''; + chr1 = void 0; + chr2 = void 0; + chr3 = ''; + enc1 = void 0; + enc2 = void 0; + enc3 = void 0; + enc4 = ''; + i = 0; + buf = []; + base64test = /[^A-Za-z0-9\+\/\=]/g; + if (base64test.exec(input)) { + console.warning('There were invalid base64 characters in the input text.\n' + 'Valid base64 characters are A-Z, a-z, 0-9, \'+\', \'/\',and \'=\'\n' + 'Expect errors in decoding.'); + } + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + while (true) { + enc1 = this.KEY_STR.indexOf(input.charAt(i++)); + enc2 = this.KEY_STR.indexOf(input.charAt(i++)); + enc3 = this.KEY_STR.indexOf(input.charAt(i++)); + enc4 = this.KEY_STR.indexOf(input.charAt(i++)); + chr1 = enc1 << 2 | enc2 >> 4; + chr2 = (enc2 & 15) << 4 | enc3 >> 2; + chr3 = (enc3 & 3) << 6 | enc4; + buf.push(chr1); + if (enc3 !== 64) { + buf.push(chr2); + } + if (enc4 !== 64) { + buf.push(chr3); + } + chr1 = chr2 = chr3 = ''; + enc1 = enc2 = enc3 = enc4 = ''; + if (!(i < input.length)) { + break; + } + } + return buf; + }; + + return ExifRestore; + + })(); + + + /* + * contentloaded.js + * + * Author: Diego Perini (diego.perini at gmail.com) + * Summary: cross-browser wrapper for DOMContentLoaded + * Updated: 20101020 + * License: MIT + * Version: 1.2 + * + * URL: + * http://javascript.nwbox.com/ContentLoaded/ + * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE + */ + + contentLoaded = function(win, fn) { + var add, doc, done, init, poll, pre, rem, root, top; + done = false; + top = true; + doc = win.document; + root = doc.documentElement; + add = (doc.addEventListener ? "addEventListener" : "attachEvent"); + rem = (doc.addEventListener ? "removeEventListener" : "detachEvent"); + pre = (doc.addEventListener ? "" : "on"); + init = function(e) { + if (e.type === "readystatechange" && doc.readyState !== "complete") { + return; + } + (e.type === "load" ? win : doc)[rem](pre + e.type, init, false); + if (!done && (done = true)) { + return fn.call(win, e.type || e); + } + }; + poll = function() { + var e, error1; + try { + root.doScroll("left"); + } catch (error1) { + e = error1; + setTimeout(poll, 50); + return; + } + return init("poll"); + }; + if (doc.readyState !== "complete") { + if (doc.createEventObject && root.doScroll) { + try { + top = !win.frameElement; + } catch (undefined) {} + if (top) { + poll(); + } + } + doc[add](pre + "DOMContentLoaded", init, false); + doc[add](pre + "readystatechange", init, false); + return win[add](pre + "load", init, false); + } + }; + + Dropzone._autoDiscoverFunction = function() { + if (Dropzone.autoDiscover) { + return Dropzone.discover(); + } + }; + + contentLoaded(window, Dropzone._autoDiscoverFunction); + +}).call(this); diff --git a/web/assets/images/Debug-Bug-icon.png b/web/assets/images/Debug-Bug-icon.png new file mode 100644 index 0000000..f77de7e Binary files /dev/null and b/web/assets/images/Debug-Bug-icon.png differ diff --git a/web/assets/images/GitHub-Mark-120px-plus.png b/web/assets/images/GitHub-Mark-120px-plus.png new file mode 100644 index 0000000..bca5dac Binary files /dev/null and b/web/assets/images/GitHub-Mark-120px-plus.png differ diff --git a/web/assets/images/PiCluster_1A.ai b/web/assets/images/PiCluster_1A.ai new file mode 100644 index 0000000..ae911cb --- /dev/null +++ b/web/assets/images/PiCluster_1A.ai @@ -0,0 +1,2385 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[7 0 R 39 0 R 70 0 R 101 0 R 130 0 R 155 0 R 180 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + PiCluster Logo 1A + + + + + Adam Balla (chzbacon) + + + + + PiCluster logo meant to be place on a light colored background + + + + + 2017-07-27T17:57:28-05:00 + 2017-07-27T17:57:28-05:00 + 2017-07-27T00:02:55-05:00 + Adobe Illustrator CS6 (Macintosh) + + + + 192 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqh Zb5Ucqq8qbE1pi2DHarDcJItRse69cWMo03NcwwxtLKwjjQVd3+FQPctQYrGJJoJf/iTTpNrMSX5 P2Tao00ZPh6ygwg/6zjBbf8AlZj6qj79vs5/Y8Z/5yKHm+8tNNnFlcW+hR8/rEXJXpNUcXmELOoF Pskse/TITt6v2Y8CEpDiBydPd5X9rIfyHTzvaeTGS9tOdo07Npy3kzxSLDxAPBfTk/dlh8PTv2wx unB9ojp5aj0n1V6qF7/MbvSP0rers+l3BYdSj25X6OcqN/wuSdD4Mf5w/wBl+pv9OWo2khukYdR9 VuGp/skRl/HG0fl5dDH/AE0f1sE/MT88NG8qTxWNlb/pXUpFEkkYf0o4lJIHNuLNyNNlp038Kgyp 3PZns/k1IMpHgh87V/yy/OPTPOtxLp8tqdO1WJDKsHP1EljBAYo/FN1qKqR8q70Yyth2t2HPSASB 4oHryp6JknROxV2KuxV2KuxV2KuxV2KuxV2KuxVL/MGt2mh6Je6vdhmtrGJppFQVZgo+ytabk7Yk t+m08s2SOOPORphHkH86tN83T3Vqul3Nte249SKCP/SBJGTxrzCoqEbV50HvkRK3b9pdgz0wEuKJ ievKv1/D5MilfzBK59LT1tkY7PcyBnHv6cHqK3/I0YXBAxDnK/cP0mvuRFtpGrMhe71GQK2zwWiL ApUe7erKD/qyDFrnmh/DEe87/qH2IyDQdGR0n+rLPMpqlxcFriUfKSYu4+/GmqWpyEVdDuGw+Q2T HC0JN50/5RDWv+YG4/5NNgPJy9B/fw/rD705wuI7FUt1nV7XTI4l4PPe3TGOxsYf72eQCtFGygAb s7UVRuTgcjBglkJ6RHMnkPx0HM9Hz5+dX5d+dX11vMrWx1CPUEQ3S2SPILZ41EYjI3YqEVf3lAGN dl6ZCQL2/YPaenGPwb4eHlxfxdb+fTp3lU/I7yR5o0/zCnmi+0u5i060jdFDJwmkMqlOUcT8WdVB qadf2eR2xiEe0GvwzxeDGUTKXy27z0/F0+hLfV7S5VZLdhLC+wkXxBoQQdwQdiDuMseHlglHY7FG 4tLsVdirsVdirsVdirsVdirsVdiqR63HHraz+X0VZLWVOGrSkAqkTj+6Wv8Au2QHb+Vfi2PGoLma cnDWXqPp9/f7h9p272LeWfyz8n6Fr+pabb2jI00UN7Y3glmS5RatFNFHOjK4VGCsaHfmA1aDAIh2 Or7Vz5sUZk8iYkUOHvBI8/8Ae7Mo+reatOH+i3Mes2y7+heUgugAOizxL6T9NleJfd8LruPDk5jw z/R3j8juPgT5RVrXzTpklylneCTTL+RuEdpfKImdq04xSAtDMf8AjE7Y2xno5gcUanHvjv8AMcx8 QE0ZSCWTr3XscLjWuVgwqPpHcYqQk/nT/lENa/5gbj/k02A8nK0H9/D+sPvTnC4iU6xrptZ49OsI hea1cLygtOXFY03Hr3DCvpwgilaVY7KCcFuTg0/EOOR4cY6/oj3n7utLtI0NLKaW/u5frmr3Chbm 9cUogPIQwrv6cKk/ClfdizVONLm1HGBGI4YDkP0nvPn8qGyY+oD9gcvft9+Fx6dxdvtNQfyrt+PX FbSu60NGupL7T3Fpe7czTlFMVFP3ybctqAMCGFOtNsFOTDUekRl6o/aPd+KV7HVllm+p3cf1TUQC fq7HksgHV4X29RfoBH7QFcLDJhocUTxR7/1934olMMWh2KuxV2KuxV2KuxVxIAqdhiqxZomrxYGn hinhKA1O9uPUSxs6fX7gEry3WKMbNNKARsOiqPtNt05FQ34sYril9I+09w/Gw+FirCxgsbVbeGpA qzyNu7uxqzuRSrMdzha8mQzNlLPMANtqOj6qoNIbj6lckH/dF/SICnf/AElYPorgLkab1QnDvHEP fHf/AHPEneFw1K5tbW8t3t7qKO4tpRxkhlUOjDwZWqDiyhOUTYNEJP8A4buLHfQdQksUHSxnBurP v0jdlkjG+yxSKo/lwU5X5oT/AL2PF5j0y+fI/wCcCfNa2v39jvrWnSW3Eb39nyu7QgCvx8VWePvU vHxX+fG0jTRn/dyvyPpl+o/A2e5b5l1Cyv8AyRrFxZzx3ED2NxxlhdZENI2GzKSDieSdJilDUQEg QeIc/eq6rrlw94dH0XjJqNB9aunBaCzVhs0lKc5T1SEGp6niu+NscOnAj4mT6Og6y93cO+XysovS NIg06KQQBpLi4b1Lu9nPKaeSlOb0p9CiiqNlAG2LXmznId+Q5Ach+PmeqP8ASB3Y8z79Pu6YWi1s 91bW/D15ki9RgkfNgvJj0UV6nFMYGXIWqEgAk9BucWK2MEIK9TufmdzikqN/YWt7D6VwnMA8kNSr Kw6MrKQysOzKajFnjyGBsIAXd9pg/wBNLXdgP+P1VrNEPCdEHxKP9+IP9ZaAtgbuCOT6fTLu6H3f qPwPRRHnvya2qppK6zaNqMhVY7dZVJLNuqgj4eR7CtcbDL+TtRwcfBLh76T3C4bsVdirsVdiqncK WhdQaEjFlE7pTPcvZqjIhkuZj6drbggGSQivU1oqj4mamw+7A5MYCXuHM9346IzTdNa1R5JZjNe3 B53VxQDk3QKop8KIPhRfDrUkklqy5eLYCojkPx1PX9SM4N/O3/C/0xarQOuaV+lNHvNPMpQ3MLxx yEA8HI+BxQdUajD5Ylu0+bw8kZVyP4+ajpV8+raFZ3tSkt1GjSQ/yS0/eRnatUYEH5YGWbH4eSUe 4/Z0PxR1vE8a+mzkE7ilKfiMLVI3urcG/nb/AIX+mLC3cG/nb/hf6Yrbyb82Gs54r2w8vxGPWZVk Gq6nbuYFSOOIzSxzelx9dzEu6vUJyFSCyVhJ6bsbiBjLKf3Y+mJ33ugRf0i+7nR5gGprovlOXTrJ LS11u+j47yHhYl3djV5HZrYs7O27MxJJ65IB1GfWCcuKUI/7P5fUj/0Jqf8A1MF//wABYf8AZLjT T+Yh/qcP9n/xbv0Jqf8A1MF//wABYf8AZLjS/mIf6nD/AGf/ABbx78yPInmfz1ONT0O+k1PS9Mje KKa8MSfWJAWaQ2awRRq6fCE5tTk32SVFcgRb1PZfaOHRjgyREJzN+m9u7ismu+ug57vUdG0a8bRN OEPmW+uYXt4fTnCWdJE9MEP8dsz/ABDf4iT45Onnc+ePiSvFEGzt6u/+tSYfoTU/+pgv/wDgLD/s lxpo/MQ/1OH+z/4t36E1P/qYL/8A4Cw/7JcaX8xD/U4f7P8A4tptD1MfENfv69xwsNx/0i40v5iH +pw/2f8Axb5j178qvNdn5yksZmBgnuFkXVy4KiKZpXWeQKeakLbyMwptxPbfKzHd9C03bGCWnEhz A+nzFbD5gD3vrNVKqFJLEADkep9zTLXzMt4q7FXYq7FUJqN9DZ2slzKTwjoFVRVnkchURB+0zMQq juTi24sZlIAfgIbSrGZbiS+vQPr0yhVjB5LBF2hQ9/sgu37TewUAM82QUIx+kfae/wDV3DztNMLj uxV2KpD5f/0fVdZ0w8uEFx9dtQ1D+6vuUjmv/MSk4p2GAObqfVCE+8cJ98dv9zwp6yhhQ4XCBaVi Dxbr2PjikhINT1O91O9l0TRJTE0RC6rqqgEWoIr6UVaq1wynYdEHxN+yrBzcWKOOIyZBd/TH+d5n +j9/IdSCCbTbIeVvMN/ZxhNPhsbux0lalqxIGNxcFiWLNc3AJLk/GqI3fA5scsvGxxl9RlGUvf8A wx/zY9OhJDO2T46VoTujeB7/AH5J0wK9HrVWFHHUfxGKCGLyyy+b5XtrZ2j8qxsUurpCVbUGU0aG FhuLYHZ3H959lfhqWHN2IA0os/33QfzPM/0u4fw8zvylEUUUUSRRIscUahY41AVVVRQAAbAAYXXE kmzzSLRQNO1q80U7W7B77SxTYRyuDcxCg/3VM4b/AFZFA6YA5mf95jGTr9Mvh9J+I+2JPVP8LhOx V2KsJ11OV7rWsFax6PNYK9OohtlNxdNQmh5Wt/ItO/64l2+nPphj/nifzO0f9lAFkOkM1nM+jykk QL6lhIdy9tWgWvdoSQh9uJO7YXBzDiHiDrz9/wC3n8x0TXC4zsVdiqnc3EVvC80rrFFGpeSRyAqq oqzMTsABviyjEyNBK7SCW+u4dQukaOKMk6fauKMi0oZpFPSR60AP2V22JYYHInIQiYx5/wAR/QPI fafcE26Sj3U/gf7cLjdF2KHYqtdiF2+0dl+eKQkmpqlj5j0i+FFjuhLpk5O1S6+vAzH/ACXhZB7y YHMxevFOPdUh9x+8H/NT3C4THtU1G81S9k0PRZPSaIgapqqgEWoIr6UVahrlgagdEHxN+yrBzsOK OOIyZBz+mP8AO8z/AEfv5DqQzUYI9K0m18vaODbXOoOba1kQkuiNV7m6LE8jIicm5mvKQrX7WKcU jkmcuTcR3P8AvY+66Ffzb7lbzTa29p5H1S1tkEVvb6dNFDGvRUSEqqj5AYnkx0czLUwkeZmPvT11 LLt9obqfcYXDBYnLJJ5ydoLZ2i8rxkrc3akhr9hs0MTDpbA7SOP7z7K/DUsObsogaXc75ug/meZ/ pdw/h5nflKbdY441gRFiWJQqRIAFCgUHEDthddIkmzvapixSXzBZ3EljFqVlGZNS02T65bRinKVQ CssG4P8AewsyDwbie2AuXppgSMJfRMcJ8u4/A7+6wmtnd295aQXds4ktrmNZYJBUBkdQytvvuDhc acDCRieY2VcWLsVSHRrWLUbXXGulD2+p3t1DJH2McCrYMOp+19WOBzc8zCUK5wjE/P1/75Q0xL2+ 8tadccq6xYDgZJDSt3bVt7mN23+CV0da+/LqBizymMM0h/k5f7k7xPvGx+xPrC9ivbSO6iBCyDdG FGVgeLIw7MrAqw8cLhZMZhIgq+LBZNPDBE0szrHGgJZ2IAAG5JJxTGJJoJRD/ubuBcE10eBg0I7X MiNUP/xiQiq/ztv9lQWDlS/civ4z/sR+s/YPMmjWOWOSU8WrxFB9J3/hhcYggLnIVlYmg3BPtSv8 MUBJPL3nzyj5ivLmz0XU4725tBWaNA6niDx5KXVQ61P2lqMALmans7PgiJZImIl+Ph8U+wuEsHxO W7Lsvz74pfPf52/m5rB1ufyzokv1S00+SP61dJT1ZLiJllHFuqCJ1HTfkPDK5Se47A7Fx+GM2QXK Q2HQA7fGx9jEPL35z+e9PuPTu9XuLqxnIS59TjLMiEgM8DyA8ZAteNfhr1GASLtNT2Fppi4wAkOX QfGunf1fVOi2emWel28OmKFseAeEgklxJ8Zdmb4mZy3Jmbck1O+Wh84zznKZM/q/G3wS7RgNU1K7 1t/itxysdK329GJ/30y0JH76ZdiOqIh74A35/wB3AY+v1S955D4D7TJJPzX876J5c8s3NnqTu13q kE0FnDEoZmJTiXNSoVVLCu/yrgkXL7G0GTPmEofTAgm1uj+Yrf8AMi2Y6cZLbyxEwj1IOQlzdSlQ xtaIzenCFYeo1av9kfDUlu059KdAfXRzH6e6I/necu7u586qbQxRQBYYkWOEKBFGoCqoUU4gDYCn TJOokTLc83XJCxl+jL9k++Kx5oB7mdiasaHsNhgbhEIyzuDICrfaXv4jC1zjSVaKP0Zq13ohFLeT nqGl7belI/8ApEQoP91TPy/1ZFA+zgcjP+8gMnX6Ze/+E/EfbEnqnuFw1nrRep6fIc/DFPCatKfJ /J/LtpctSt8Zb+g6AXsr3IHfp6vjgDla7bKR/NqP+lHD+hJdD84eV7fzZq3lU6hH9fe8aa0takr+ 9iSSaMPTiH9f1WKVrvgBcvUaHNLBDPwnh4aJ9xIB93DW6Y6rquneV7pr/UbhLXR79wJpZDRY7kL8 LfKVEo3uAf2mOHk0YcM9RHhgLnH7Y/s/T5BPLO8tL21iu7SZLi1nUSQzRkMjKwqCpHXC4c4ShIxk KISnzvpdnqnli/sLpS0dzH6SKCVrI5Cx7gj9umAuToM0seaMo9Df6/sUbXyH5UtreO1jseMcKBIx 6sx+FRQdXxplPtHPImRlz8h+puPyN5ajk3tSwbYfvJdv+GxpT2hmI5/YEs1/y95dFNKsLBZ9Uu0+ GNpJvThiYlDPOQ4ITqFUbudh+0ypDkabU5frlKoR8hue4bc/u69AYT5V/J+z8tavqmoxGTW47Cb6 nJZEGKUwSQQ3DSRFGHKVDJTgdmFe9MiI07fWdty1GOMD+74hd8xdyjR8tufT3PR7Xy35QvbKK7so FmgnFYZFlloa/wCyqKdwdxkqdDPVZ4SMZGiPIIgeSvLIAH1Pp/xZL/zVjTD8/m7/ALA+YPze8rNo 3nPU5LRTLpcswZJ0DMkcsih2t3fcCRa141rxIPfKpDd9D7E1ni6eIltOuXeO/wB36WNeWvLWr+ZN Xg0rSoGmuJmAZgDwjSvxSSN+yq9z/HABbsNXq8eDGZzNAfb5B9famkmn6Jp/l7TpWS8ukj0+1mU0 eOKOOk1wN6gxxKSp/n4jvlz5diInkllmPSPUfM3sPifstO7WC3tbaG0tIwlvbosUMa/ZVEAVVHyA wuJORkTKXMvNfzp/LGXzXZw6ra3aW95pkUnNJAxjki+2RUVIYEbbb5GUbd/2D2sNNIwIuMyPgUx/ Lf8ALzVfI2iPbw3MOoXNzJ617EwaJeQAUCGX4jsB+0nxH+XECmjtTtOGsyWQYgbDr8x+o7ebMINV tbmQWzBrW++0trcAJIeO5KUJWQDuY2YZJ1UsJiL5x7x+NvjSJnUzQEL1O4HuO2LXE0UtIINDsR2w OQirGIFmZvDYfxwteSSD8y6fK9pHf2URk1HS5PrVtGv2pQAVmgFa/wB7EzKPBuJ7YC26XKBIxkfT PY+Xcfgd/dYTG2uLK6s4Lu2b1be5jWW3cVHNHUMpFadQa4WicZRkYnYjmgdYk/R2m3+o7M1nbyXP AioJjRnp1H8vjgbsA45xh/OICtoWnpZaLYWLbvaW8UDmpO8SBT+rCGGoy8eSUv5xJ+ZeeaX+TGg3 vnKXzm1zMbW4u5L22sKCjMzEiUyg14O9ZFAH2SN8hw7273N27lhpxp6FiIiT+iu8cj52mfnPyFpP nCwm02BXgtrJ2lF5GxJe6RWVYk58lKLzYSHx+EbhqEi3H0PaM9LITO5l0/o9/wCr59zKfJ+ladpX lfTLDTef1GK3QwGQ8nIccyzGg3JavTCHW63NPJmlKf1Eq2ufFFaQj7ct3blB/wAYpVlb/hEbEsdP zJ/on7RSYstR4HscLjhKdX1aeOVNN0+NZ9ZnXnGjV9KGOtPrE5G4QEfCvVz8I/aZQ5WHCCOOW2Mf M/0R5/dz7gVdL0qHT7OQh2nu5z6t5eS09WaUD7TUoABSiqNlGw2xY5sxnIdIjYDoB+PmpaJ/x0/M H/Men/UBa4hlqPox/wBT/fzQGsKfLz3fmK0p+jkDTazY1ADBRWS5hrQCVQPiX/dn+tQlbsB8cDFL 6+UT90T5d3833JPpH5jWfnl5NN8pyy25j31HUJkVHghJoDBGxbnJJuFJHFOrb0VhduVn7Llo6nnA P82I6nzPcOvU8h1ImNpo2lWWmLpsVun1FAQ0TjmGqeTNIXqXZm+JmapJ3OSdXPPOc+Mn1fjl3LrG w02xjMenWkNtG25WCNY0Pz4gDvijJknM3Mk+/dLNEH6U1O71yQ8rccrHSwPs+hG/76Ubkfvpl6/t IiHvgDkaj93AYxz+qXvPIfAfaZJ9hcJL/MX/ABwNS/5hpf8AiBwFv0v97H+sEwwtCldWdrdwmG6i SaIkHg4DCo6EV6EdjiyhOUTYNFLxaapYPSym+t2x3FrdMS48QlxRm96SBq/zDA38cJ/UOE94/V+q vcWn8y6JDLDDqEq6ddzyLFDbXnGJ3kbYLGSSknzjZhjaRpchBMBxRG9x3+fd8aTR0DAdmH2W8MLj AqZukVuDD950oOlfniy4OqTaGn6M1a80ZxSGXnf6ZToIpH/0iFdv91TPy/1ZFA+zgDlag+JAZOo9 Mvf/AAn4j7YnvVPN/JtAvrZKcr5YrAE9jeyi2r26eriUaL+9if5ty/0o4v0K+tl5RFp8DFbi+JSR lNCtuorM9RuNiEVuzMuJYaehcjyj9/T9fuBW3E73cv6K08mCOIBb64j+H0UI2ijI2ErCn+qvxd1q pjHhHHLfuHf5ny+87d6ZQ20MFstvAixQxrwjjUUVQBQADC48pEmzzQXl400mGL9m2aW2TtVbeVoV P0qmANup+snvo/MWo3lzHPq+lxJXkksk2/8AIsEkZ/4aVcWcIEQkfID7Qf0L9X1eaGZNO05Fn1ed eccb19OGOtPXnpQhARRVG7nYftMqjDhBHHPaA+ZPcPP7uZ6AqaVo8Onwvxdp7ydvVu72WnqTSUpy elABQUVRsooBsMLHNnMz3RHIdAPx169UZsSV6B9iPA0/pi1JTojn69rxH2mv4wPmbC1wBydQPTj/ AKp/3c0Br7nzALvyrp9DbOhg1u/IDLBHIvxQx12a4dW27IPib9lWS3aYeBWaXPnAd57z/RH+y5Dq Qj5E/LPy15La7fSDcTz3nESz3Lq7BF3CLwWNQKnwriI0z7R7VzauvEoCPd+Cy0pyHx7g/s9sLrLS fzHczx2sWlWTmK+1R/q1tKh+KKOhaecbihiiBKn+fiO+AuVpYAkzlvGG58+4fE8/K01tbW3tLWG1 tkEVvbosUMa9FRAFVR8gMLjTmZEyPMquLFLfM0kcfl7UWdgq/VpRVjQVKHxwFyNICcsa7wmKurqG QhlbcMDUEYWgim8UNOpZdvtDdT7jFILH7rSdL8z3KTajax3Wm6fIfqSSCvK5U8ZJflHTgvvyO/wn Bzc2GaenFQNTlz93QfHn8vNHfVNUst7Kb63AP+PW7YlwP8i4ozfRIGr/ADAYtPHCf1DhPeP1fqr3 F0F5Y3VyIn52l+dxaTgK549Su7LIB3MbEYrLHKIseqPePxt8VDzFbXMlpHfWkfPVNKk+tW0S0rKo BWWFSQf76JmQeDcT2xLPSzAkYyPonsfLuPwO/uvvQ2s6jaagmjRWkySR6pd2c0LVoTFDyvlYA0Px C38O+LZgxShxmQ+iMh8T6P8AfOivZ7u7llsiDd3oC2shHJLexRiBO3UVmbk0Y/b+GuysQrLGIxAl 9MefnLu+GwPdv3hObTT4bK3SK2BHGpZmNWkYmrM7ftMx3LeOFxJ5DM2f7ESjhhUfIg9QcWBDzTyV +cXlXWPNV15etEnQ3VxI9hcOqiKThEpcCjFhzZHdaj7jtkRJ3+v7DzYsIyyrYCx15/o2DCj/AM5A wzebENppaJYH1LS1uZpGJX13jpPJGq7hfTr6YNabcsjxu3/0NEYPVL1bEgDuvYH48/se46To0OnQ uFlee6nb1Ly8koZJpKU5NtQAAUVRso2G2WPH5s5yHlURyHQD8fNH/GPA/h/XFp2SHzXr0Gj6Ve6l cKxgsYWlkRftNxFQo+Z2wEuZo9Ocs4wHOReMeV/zluNX1y500rFoa6xceqdUMoY26JbrGyjmqpzZ YAFZtgT0PTICT1mr7CGLGJ75OAfTXP1X8t+X2vYtK13yLp+nw2lrq+nxW8Y2j+tREkseTM7M5Z2Z iSzMak7nJ2Hlc2n1M5GUoTJ/qn9SN/xh5R/6ven/APSVD/zVjbV+Rz/zJ/6UqVx538pRR8hrNg3/ AEdQ7Adz8WNso6DOT9E/9KUh8vedfKusX91r0ur2kUYH1PS45Z0jZYVblLKUdgymaVe43REPfAC5 up0GbFEYhCR/ilQvfoPgPtJZGvnHymRvrVgD3H1qH/mrDbgfkc/8yf8ApStl85+UY4nkOtWJCKWI FzCSaCuwDY2kaHOTXBL/AEpfIvnXztrXmzWZr/UJ3MJc/VLSp9OGOvwqq9K06nvlRNvp2g0GPTYx GI36nvT/APJ3z5q3l3zXYWQnd9H1GdLa6tGJMY9ZgiyqP2WVmBNOo2wxLhdudnQz4JSr1xFg+7o+ svVi/nX7xlr5pRS7VLsyumm2svCe4BM8yMA0MA2Zwezt9lPf4t+JwN+GFDjkNh9p/G5+XV5r+YP5 2weTNcXy9pWmJdi0jiNwWkMaIGQMsUYUN+wVNfwyJlT0HZvYB1ePxZy4eK66/E/FnXlrz95b13Qr PVkvIbUXScmtp5o1kjZSVZWBI6Mp379ckC6bVdm5cOQwomuoBRt1q/lW7hMN1fWM0RIPB5omFR0I qdiOxxaYYc0TYjIH3FgH5q+eH8seV2k0DWI7q4u5BbQKzrcTW4ZWZpElDcqALT95yNSN9qZGRp3f Y/Z41GassCBEWegPlX6qfMjzTPKZndmlJ5GQkli3jU71yt9CEQBXR9Df84/eddX1LSdQ0mW3a+vL Jo3S9kkVaxupRVmkblIeHp0UhW227ZZAvDe0mgx45xmDwxle3n5Dlvfk9Z9HXp/7y4gs0OxSBDNI PdZZOKffDknmeLGOQMvft9g/4pTl0O1KmW7lmvWH2xPIfTcD9loY+EJ/4DGmUdQeUQI+4b/M7/aw fyX+V3k7SfOF7rNpDKtxbTsllA0gaGH1IEclV4hq/vWA5MaDAIi3ca/tfPkwRxyIojc1uaJ/Ukur fkd5e0zzLFqulpNcrGJNRXRnKmN/q80LNBGVCt8SSNwB/aAqaVwcLl4faDLkwmE6HKPF7wdz8t/L lu9hsb21vrOC9tJBLa3KLLDKK0ZHFVO9D0OTeWyY5QkYy2IVsWCUa7pFrq1pdWVzF69pcxmK5j3F QwoQCN6/LAXK0+eWKQkDUhuHk/lv8ptG8va1f6tFJczx6Vc+gXduDwRSW0UpuFMYTk0frHkDsUr8 JOREXpdV2zkz44wPCOON+88RFb99fPq9ZSTV7BFEifpOzA2miCpcqvi0eySeJKFT4Ick8yRjny9E vPl8+Y+N+9HWWo2V6jPayiTgeMibq6N14yI1GRvZgDhasmKUOY/Hl3qk8CTLxb6DixjKlGw06006 3W3s4Uht02WKNQirvX4VUADrizyZZZDcjZXXl5aWUD3l1PHb20YBmmlZURQTQEsxAG5xYwhKZ4Yi ylD6tqerxtFo9nwtJBxbUtQR44irAV9K2+CaXYn7Xpr3DNgcoYYYjeSXq/mx5/GXIf7I94D5g88f lX5k8t61dWkFtLqNjEi3CXdtG0gWGRmCGYLy9M1jYb7Gm2VGNPonZ/bGLPjEiRGR2onqO7v5sm/K H8ofMV55hs9a1izk0/TNOlW4RLlCkk0sZ5RqI2o3DlQkkUI2FcMYuv7b7bxQxHHjPFOQrboOu76O vdQisraS4uFYKgFFQci7E8VROlWZiFUdzlrwWPEZmghYCNNtJL2/PK+umDSrH8TFztHBEP2gg+Ff HdjSpwNsv3kuGP0j8En8eTCvNn5LaR5w1Ia1qtxNY6jLxWeK1MZT0kFFViytWQDYv09tsBjbttH2 9k0sPDgBKPnfP9XkzrQdE07QtItdJ06P0rKzThEpNT1JJJ7lmJJ98kA6bUaiebIZz+qS7UNZsLF1 hlcvdSCsNnCplncdKrGtW4+LH4R3IxXHglPcfT3nYfP8Fhf5k+Tde88eWZLRlh014HFzYW8h9WZ5 lDKFlkQ+nGGV2FF570PLtkSLdt2VrsWjzCW8r2J5CvIcz8a9z5uuPy789298bGTQL76zXiFSB5FP uroGQj3BpldF72PaemlHiGSNe8f2vdfyG8rnyx+lLHV1a18y3XpSvZyFf95FB9No2Usr/G7B6HY7 HJxFPHe0Wr/McMse+IWL/pdb/Q9dyby6yWhQrSpbYD54pileg2qUuro1Ly3U43/4pc24/CLAHJ1M +Ue6I+3f9Ktqfw6jpLjYm4kjJ/yWtpWp/wAEi4sMX0T93++CAsq6Lrz6adtM1Z5LjTjvSO63kuYP YSbzJ7+p/k4t+T97i4/44UJeceUT8PpP+b5pxdpI5QRtSnUdOvQ4XFgQOa9A6KFNAB3AqP14sTul eiFjqPmDowN+nf8A5cLX54A5Oo+jH/U/3829MZ9Nuv0RIP8ARiDJpbV/3WPtW/zir8P+RTrxY4oy /vI+IOf8Xv7/AI9fP3hF3ul2d26zSRtHcoKR3UTenMo60Dqala9VNVPcYWvHmlHYHbu6fjz5pF5h 8w6h5Z0y4vr9heafaxmSSdAkVyB0AZGKxOSe6lfALgJpzNNpo6iYjH0yPTmP1j4370p8l/mLqPnO xaXQ7EWyxyGKe8vyGjjYBWpHHEweY8W6FowP5j0wA25Ov7MhpJVklfcI9feTy/2XuZPaeWbSK5jv r+STVb+M8kubriRE21TBCoWKLp1ReR7scNOvnq5EcMRwR7h1955n47eSY3N3bWVrNc3LiO1t42mk lNSFjRSzHavQDC48IGcgBzJpj6WdwnlXVtQvYzHqOqRTXV1G1OUQMXGGA0A/uYlVT4tyPfA5xmDm hGP0wIA899z8Tv7qDJW+Fw3Y/C38MLrwk015BPcm/nq1hZOYrKNRVp7rdHZV/a47xp78j04nA5cY EDhH1S3PlH8bn4eYRNnp07Ti/u6C6oRDbj4o4Ebqq+Ln9ph8hti15Morhjy7+p/Z3B85fmF+dHne XzXf22l3z6bYWE8ltBBCFq3pMULuxBLFitadBlZkXvOzOwtOMMTOPHKQB383pP5Y+e/MfnDy6Wv5 ZY5rOQwXMtjb/vp6KGDeq37mKobiQq8u4K5KJt0Ha3Z2LS5fSBUhY4jsPhzP3e9ntgq6ejpZ6Hcx mQ8pZC9s0kjAfakkadnc9qsSck6XJ6/qnH/Zbe4cNBEC41uRuSWMCoDQCW5ZWr40SGQfjiw4cY/i P+l/aFC71DU7b95dy2VgrcVTk0lwWbeiotLcsx7KN/nizhjhLaIlL5D/AIphn5iaD5t8x+X5pbWS GzksEa4tr145bS4ICn1EjCyzOqumx5hT7U3wEW7XszUYMGUCVy4tiNpDyvYcj3Wn/wCVtlq+n+UL fTtZvDd6rZySR3Ydi7xEtzWJmbdqIwIPShFPhphjycLtfJjnnM8Y4YSqvPz/AB8d2VJ8Tc+3RPl4 /Thdae5A+X99Kil7XDy3K/K4laUfg+AN2p+sjuofIU7XdrW3kGzR3drQ+HKdEb/hXOJXT8yP6Mvu JST8wLO41qyh8t6dctaardulzHepu1pHbSK5uD0IJYBE4kMSdtg2Jczs2YxSOaYuEdq/nEjl+k/t CaeWtQmu9IVbwn9KWTC21RWoCLmIDm2wA4yAiRNhVWBoMQ42qxCM/T9Et4+4/q5HzBTjC4qT6Ko/ SfmAjY/X03H/ADAWuAOVnPox/wBT/fzVdfW2/Rry3dzHZC2Imhv5CFWCVTRHPIqKb8WFfiBK98Sx 0xPHURxXtXePx8ubHvL/AJ41nzXZepoOmfU1jkaG61HUgRAskZAcQQoVmn7/AGjFTxrVcANudqez 8emlWWXF1EY8/ieUfhxfpTGPyRp0si3WrzSazqKigub0K6JUAMIbdQsMQPHqq8j+0zYaaD2hMDhx jw4d0f0y5n4mu4BM9K0XTdKh+q2FvFawirJFbosSCp3oiALhpx82eeQ3Iknz3R1WHUVHiP6YtKQ6 0BqWq2mip8VrHx1DU9qgRxv/AKPFuP8Adsycj/kxsD9rAXNwfu4HIef0x/3x+A+2QPRHeYG5eXtR P/LtLX/gDiWnTD97H+sFDzFqSxRrYo7LNcikjRbyJETQ+mB/uxz8EfvVuitiWelxWeI8h8r8/Icz 8uoQ9vNZae0LX9P0gsfp2Gl26mV4ogAtIo0BJ2pzkpxHSoGLOUZTvh+nrI7WfM/cOfxRXp67qH96 36JtD/uqMpJdsP8AKk+KKL3Ccz4OMWu8cOXrl8o/LmfjXuLy7zD+QGj+Y9fvtQ0zUpNMt/UCzLIh u/VuBvO6u8iN9o0YszHnyyJhb0Wm9pMmDFGM4iZr+rQ6dP1bU9H8l+SdN8oaHHpWlu7KGMs80tC0 srAAuwFKbAAU7DJAU6HX6+eqycc/h5BML7W7OzkW3nYi5kFUgiBlkYeKogLU9yKDvjbRjwSkLHL5 LR+m7zYBdLt+1eE1yR8hyhjp/wA9K+2Kf3cf6Z+Q/Wf9iq2Wk2NpcPLGhe5ZAr3UrGSZhU7GR6tx /wAkbDsMLHJmlIUeXcNh8lvmHfQdRXu9tKijrVnQqo+knEp0397H3hR1iyuTKL7Tv97404yxVos8 IqfSapADVPwMehr+yWwFlgyCuGf0/ce/9Y/TSKtdTtbnTTexN+6VX5gijI0dQ6MvUMrKQR44WueK UZ8J5rdCiaLQ9OicUeO2hVh4ERgHpiE6g3kkf6R+9h35zedLryv5XEttbC4lu5VgR2qEjJDOHNPD 09hkZGna9haCOozUTQiL9/4tX/KTXm8y+XZfMdylNTvrh47sj7KrAeMUUXUrGiNWn8xZv2sYm2Hb Wn/L5RiH0RG3x5k+f6KHRNteU6PqC+YohS0dBba2gFf3AJ9K56/8e7MeZ/32zE/ZXCXG058WPhH6 ucPf1j/ndP6QHeU51S9+oaZd33pmb6rDJP6S9X9NC3EddzSmFxMOPjmI8rIDxX8r/wA2vNfmbzPq OlpZ2UMupMb0XJEzLbiKOKE8ow1ZfgjUAck+I1r2yEZW9b2v2Ng0+GMzKR4PTW29knn03Pcdnrln 5atEuI73UJZNU1GM8o7q64kRNQCsEKhYoenVV5HuxyVPMT1ciOGI4I9w6+88z8du4JsVB37+I64X GtTnleGPls3YdsUxFlqGVpYudKMp6eOKZCi67vLa0s5ry5cR21vG000pqQsaKWZtt9gMVhAykIjm TSW+W7G4W0l1C9jMWpapJ9auUNOUQICwwGgH9zEqqfFuTd8Ab9VkHEIR3hDYefefid/dQQvnrUW0 rynqt79XlulS3cNFAvJ/iHHlTsFrVj4b4lt7PxeJnhGwN+qW+XdH8xamTrerP+jZ74CRYIxyuYom HwQ8pFCwlV+FqKW7hlJOAN+qz4sf7uHrEevQnv25+W9eRZRZaZY6dX6rEI/VI9eQkvJI3QNJI5Z3 btViTknXZMsp/UeXL9g5B2q3kttaH0AGu5mENojbgyvspIG/Fd3an7IOK4YCUt/pG59342Hm80/M 780L78vbjStI02wju1lgM0txcs1Wo5U/Y4/GxBZmPj0yEpU9B2T2RHXCeScjGjVD8cu5nWly6pru mWmoTynT7S8hjnSztzWXjKgbjJOwBGzbiNVIP7RyTpswhhmYAcUokizy27h+sn3JrZ6fZWUZS2hW MOayN1dz/M7mrO3uxJwuPPLKZsn8foVfTK/3Z4/5PVfuxYX3oZbtzc8SooSFI+RxbDDZT14gaeAa lXuLVHA6lXuI1YfSDgLLT/V8Jf7ko6NSAS32m3P9MLSS8X/PfzrrPle9gs9Db6q2s27tqMxVXVwp Ea8FcFVcLUM3ccfAZCRp6z2d0GPURMsm/hn0/f8AL9vey78mfO+qebvKj3mpxqt5aXDWrzRrwSUK iOG4jYNR6EDbDE26zt3QQ02fhh9MhfuZpf6bp+o27W1/bR3Vu/24ZlDoe+6tUHJOpx5ZQNxJB8mJ z+WINF1dZtGddIW8ZVhljjBtxL2guIQUV4pf2DVWR9lb46ZGnZR1ZywrJ6+H513xPQjrzBHMbJ1Z a5HdTNo+r2wstTkVx9UkYSQ3EYHxNbyEKJUp9pSoYftKMNuJk05iPExnih39R/WHT7u4qPluSTT5 5PLlwxYWsYm0qVuslkSFCVJJL27ERt/k8GO7YhlqgJjxR12l5S/VLmPPiHRC2Hk/Q4rzVptLtINL 1BbtWhvbaJEdT9WibiwULzjZnbkh2Nex3xptya7IYwEyZx4eRP8ASPyPcU60vVHuHks7yMW+p24B ngBqrKdhLET9qNux7dDvi4mbDw+qO8DyP6D5o9mpt1J6DC001wB3f4j4dsVtbGAgWmysB9B/txSd 0j1g/pHWbXQaf6LHw1DUSehjR/8AR4dx/u2dOX+rGynrgczB+7xnL1+mPv6n4R+2QPRkGFwUv8xf 8cDUv+YaX/iBwFv0v97H+sEwwtDUhQIxcgIAeROwA774pHNiXl3zKNd1fVLue0ktdK0MtBZ38xAg uCa+tcI3SiqlFI6KTv8AFQAF2eq0ng44xBBnk3IHMd0fx19y+80q11aSz1TVbOOZpLqIWFvcxq5g g3Kni4PGST7b9D9lT9nFjDNLEDCBr0myDzP6hyHxPVNHsLrTHafSk9W1Ylp9LqFFSas9sWIVGPdC QjHf4SWYrjjJHJtPY/zv+K7/AH8x57AGFjf2t9AJ7Z+aVKsCCrKw+0jowDIy91YVGFoyY5QNFVJJ PFf9k3h/bixaWOMSEhRWg3798Ukmkv1n96LSHs93BTuS0TiY0+Qi/wA6YC3YNrP9E/bt+lMC5aoT p3c9B/XC0UxXVvKugec7l/0zaLeaXYM8NrVmRnnqBNIJI2VwqFfToCPi5VGy4Kt2WHWZdIP3Z4Zy 3Pu6Cj38/dXmyDRtF0rRdPi07SrZLSyhr6cMY2qdySTUknuTvhpws+eeWRnM8UijcWlRvbOC8tZL adeUcgoRUj6QRuCOxG4xZ45mJsJTBBb6nbS6NrUYuLm0KsJG+FnXcRXMbJxMclQalCCrg0oOJwOT KRxkZMewP4MT3j38xz6pDr0OvaVZw3EjNqCaYfrGnatxrPCVXi8F4iAc4ZUJRpkFV2Zl+HngLm6a WLJIgenj2lHofOPdIHfhPPkDvwpv5N8zaLr/AOkbrTLqOYPNFK8IdDLGHtYQBIqluJDKy/MHwwgu LrtJkw8MZitj7j6jyTTVdNW+WNonMF9bEta3iipiY9QR+0jdGQ9R4GhBcfDl4Oe8TzHf+3uKzSdS ad5LS7jFvqluAbiGtVZTsssTGnKNu3h0NDgTmxVUo7wPL9R8/wC1MsLjqF1dW1pYS3V04jtreJpZ 5DWioi8mbbfYDFnCBlIRjzJSvy3Z3C2ct9fRlNT1KT63cxtTlGpULFAaAf3USqh/yuTd8AcjVZBx CMT6IbD9J+J391BOQeIr1Q9D3GFxUB5i/wCOBqP/ADDS/wDEDgLdpf72P9YIu8vbazgM9w/CMEAb EszHZVVRUszHYKNzha4YzM0Ej1MX11berdxhBMyxafpTfEHlf7L3XE/GE+2Y12VQSeRpQOXi4Ymo 9Pql5f0fuv7urhZxTXEOkQktp1hw/SUjbmabZ44mI6kk+rL41UGoZsV4yAch+uX0+Q6n9Efj3BMd W/48v+YqL+OJcfD/ABf1Sj8LSll9pjvcm806QW2oABZJCKxzIOkcyj7VP2WHxL22JVg5GPKAOGe8 ftHmP0jkfkQrpupx3DNbSxm1v4RWe0c1IB2Do3+7I27OPkaMCoLHLiMdxvE8j+jyPl943RMkqqxU H4yAAOvj2xawEBqCE3ekgiifWm+Huf8ARZ/tYG7EfTP+r/vou1i5mb0tNs24Xd5VRIKViiWnqy/7 AMAv+Wy12riuCI3nL6Y/aeg/HQFMLa2gtbeK2gThDCoSNBU0VRQDffC0zkZEk8yqYsXYq7FUu1ey nf0ryzoL+1JaCporhhR4XP8ALIAB7MFbfjgcjDkAuMvpPP8AX8PusdURp17Be2cdzDURvy+FhRlZ WKsjDsysCrDscLXlxmEqLyny75HtvJevazqmmXdwmlrcizvJTwdoInghuElYFaPCskxWQ7Mq0bkA GyAFPS6rtA6vFCEwOPhseZuUa99Dbpe1cnpi3Wr2yj6xapeQ/wC/7M8Wp1qYJD0p/LIxPhknnjCE uR4T/S/WP0gKVydM1niLW69DVLSslvJxKXEJOx5wycH9N6UZWFGHvQhZQ48X1C4S59x+I6joejH/ ADJ+bPl/yrAIvMKyxauOun2y+oZF7TRMxRPSamxZgeopUHAZU52l7Gy6k3iow/nHavI+aQaR+cHl PzrqemaCvq6ekkwmuUvAirOYCGht42VnFXl4seVKhSu/LBxW5ubsTPpISy7S2ocPS+cj7h999Hqz A9R9ofj7ZN5sNIR0HQ7r/HFS82/PbzH5l0HyrG+iLwju5TDfXPpiT042Q7UYMF59ORH4nIyLv/Z7 S4c2YjJ0FgcrP7E0/Ku61nXPLNlr/mNHbVpOawvIoQCIHiJI4lChDIOppU/6tBjFxu2IY8OaWLF9 H6e4nrX43Ta+vpZNQMlsBJNEzWWlxtujXLCs8zU/YhUcSQQdnXqRhcbHjAjR5fVL3dB7z/xJ6JvY WENlZLaqS4FTLK9OTu5LPIxFPidiWOFxcmQzlf48ggdVvYx9SBqxF1HVh0NK4G7DjPq/qlNFlEo/ dnbu3h/bhcciua4FVHFd6dhvihCalp8N7GplLQywnnb3MZAmifpyRqEb9CCCrDZgRti24spgdtwe Y6H8fMdEDZXc9vfrbavxS5koLa6QUhnJB+Hevpy7fYJ36qTQ8Q3ZICUbx8uo6j9Y8/nW1rapcwwa laSTuscNvBc3TyN0URiNCT8llJr/AFxYYYEwIHMmI+d/qX6NbTES6jdIUu73ifSb7UUK19KI/wCU ORZ/8ontTEIzzG0I/TH7T1P6vJMsLjuxV2KuxVp68GoKmhoMUhjxeXTNQa8cEadeMq3oOwjmNESf p9lhRZP9i2wDHA51DJHh/ijy93d+kfEdyJ0deeoeYUdFZGvkDKdwQbC1BBFMWvOajj/q/wC/mhdO eTy/fRaLOSdKuiV0WdyT6TAFjZO1OwBMJP7Pw9VHJbMoGeJyD6x9Q7/6X/Fee/XY6vLG1vECXVvH MqmqcxUq3TkppVW9xvhcSGSUPpJD4/8AzTN1/wArB1xLhpGaK5aOL1XeRhEgAjHJyzEcKUqcplzf Uex6/KwIrePTv6/axZHeN1kjYo6EMjqaEEbggjA7Ii9i+5tFlu5dHsJbwcbuS3ia4U9pGQFx/wAF l4fHc4iMkhH6bNe5EOCpqOla/T/biwCC8xEHy/qJHQ20v/EDgLbpv72P9YL9b1H6hp8kysizN8EB kNEDkH4n6fAgBd/BQThKNPi45V06/jvPIeaC8t6dwiW+lV1Z4/Ss0l/vEt68uT1p+9nb95L3rQH7 NcAbtVls8I+Pv/VHkPn1TPUJVitJJHYJGoq7sQAFHUknphcfELlTBvMera7Mlk/l3TP0nFHcpJcy yOIE9Ja19IvQvXsygr4VyJdxpcOMcQyy4PTt138+73c090bUdUvYzNbW9tJEQQwNzKpDKaFXU29V ZTsVIqMIcLPihA0TK/6o/wCKTX1tdA/3jtAB/wAvUn/ZPhcfhx/zpf6Uf8UsWbXnIc2drxH2R9ak +/8A3nwJ4cY/il/pR/xSldDVLiKaG6sLKW3dAJUkuXKlanqDb4socESDGUr/AKo/4p4xFrf5k3n5 pafYiK4uvLyXUaQhkM1ubASo7S/WjHG0oX0wwdjUlRUt3hZt6s6fSR0UpWBl4fceKjtw2a58vPo9 +yx4p2KuxV2KuxV2KrZoYponhmQSRSKVkRhVWUihBBxTGRBsc2HeWzrugXesJr8QGlz3nqadqMbm bjAsMcMYuTTktI4l+Nh15cj0LRDtdV4eaMPCPrEfVHlvZJ4fiTt7q8pRqFnYanYSWlwQ9vcKCCrU PUMjow6MrAMrDoaEZJ12KcscuIcx+N/0pfompXizyaLqbh9VtV5pcAcVubevFbhQOjbhZVH2W/yW WoDdqMUa8SH0Hp/NPd+o9R5gsV/Mj8l9G85XC6jHctp2sBQklyqCRJlUUUSJVNx0DA9PHagMbdl2 X27k0o4COKHdyr3Ma8g/84+aRaXVvrGs336SETepDZLF6cXJG2MhLOXFR9nYeNcAg7DtH2lySice OPBfW9/h3PUjoMln8eiXH1IdfqTgyWh+UdVMX/PNlHcg5KnnPzAn/eDi8+Uvn1+N+8NjX1tyIdag OnOx4idm52jk/wAs4ChfYSBCewONr+W4t8Z4vL+L5fqtD+btX0zTfL1+dRvIbVJIJEhaaRYw7Mho q8iOTewxLPRYZ5MseAE7jklq6hYeZ9ae4huYpvLejgGW7V1aCadgJCocEqVRePI18VNQxx5uQcUt PjogjLPp1A5fb0+fMBPf0tc3nw6TB6kZ/wCP6eqQfNB9uXxHEBT/AD4uH4Ij9Z+A5/qH3+S5NDhk dZtSkbUJ1PJfVAEKHxjhHwrTsxq/+VjSDqCNoDhH2/E/geSq9gOQ4vQE9xhYDIh59FaKU3umyCC/ NPV5V9KcKKBJlHt9lx8S+4qpFNkc9jhnvH7R7v1cj9q631q2nWZLkiymtF53sMzAcF/mDfZaM0+2 Nu2xqA2iWAxqvUJcq/HPyXr5g0N7OS8hv4J7WIhHlhkWUc22VB6ZarMTQKNz2w2g6bIJcJiQT3iv vQa2V5rEvq6lEYNLIBj05iOctOjXNK7Gv910/mr9lQ2+JHEKgbn/ADu7+r/xXy7yedNhhcN2KuxV 2KuxV2KuxV2KuxVi0+kz2czyaWywEsS9k9fq71P7IG8RPim3cqxwOxjmEhU9/Pr+34/MKlwqavFD BU6Z5isqz2PrL8auBQlSDxmhdTxk4nod+LUooifCJP14pbGvxtIcxf2hM9E1dtStXMkf1a+tn9G/ s23aKYAEitfiVgQyN+0pBxDj6jD4Z23idwe8fjYjoV2hB/0VBuP2u3+WffEI1H1lH0fxH3f24WlC 399Y2kYF7PFGstUSN9zIenFUrVzv0AxbMeOUj6Qdvs/U+YPz3tbiHzVA8VrNa6NJbqdNjkR4oxv+ 99OJ/wC6+LqvFfGmVSfQ/Z2YOE2Qcl+rqfKz19+6d/kBDfoNRurgBNGVozFPc281xbJcruXojokb KlKyN023GGDie0konhiP7zyIB4flZ9z32H9MTRLLDf2csTgMkiWzsrA9CCLihybxUvDBoxlf9b/j q/0de/5bLX/pFk/7KMLHixd0v9MP+JaaHXqr/plr1/5ZZPA/8vGBPFi7pf6Yf8SteLXyeC3lrU9T 9Vk2H/SRikHF3S/0w/4l5B/zkA2qXflq2FtNHfWtlcn6/LaW8irFUcQsk3OVft05JXrSvbIzeo9m xCOY2DEyG1kb+4UPn72H/wDOOtpqUvn0TwRF7G3gka8kIqiFlKxbnYOWNB3py7VyMObtfaecBpqJ 9RIr9Pw/Y+octfOnYq7FXYq7FXYq7FXYq7FXYq4gE1I3xVD3un2d9D6N1EJEBDIdwysOjIwoysOz Ka4s8eSUDcS87/MXW9R8hw2/mVJBflnWwCy/BJMjK8ixTlRxb0+LOkgAYfZIbmWyJNO97L08NYTh Pp/i93Sx79gRy67UAl35WfnK3mBJdJuNNEeowDnA0cqLE6M1DyMpUrxLD7PIkdtsEZN/bHYXgkTE vSfLf7P2PSBZ61d73l2tpEdzb2Qq3aqtPIKke6IhyToePHH6RxHvl+ofpJRVjpOnWTM9vAFmcUku GJeZwP55XLSP/sjha8mac9idu7p8uSD822NleeXb9Lu3juESCR0WVFcBghowDA0I8cBbdFklHLHh JG45JlbWtrawJb2sKQQRiiRRKERR7KoAGFx5zMjcjZQc2h2Zlee1Z7C6c1ea2ITkx6mSMhopD7up ONNsdRKql6h5/oPMfAoe51W/0lPU1P0Z7UdbqJhC4HctDI1CB/kOSey4GyGGOXaFiXcd/tH6R8Uj 0X80tD8xT3UHl6KW9ms3CyB1MKUaoWQu3RCQexb/ACcAlbmZ+yMmAA5SIiXx+Hv+zzT6LSbi9QSa rcerG/xGyhqkG/aQ/bl8CGPE/wAuFwpZhDaArzPP4dB9/mmiwQLAIFjVYAvARAAIFpTjx6Up2wuM ZG7vdbbWlpax+nawxwRk1KRKEFfGigYpnOUjZNquLF2KuxV2KuxV2KuxV2KuxV2KuxV2KpL5v8o6 P5r0WTSNVRjbuyyJJGeMkci14uhIIrQkbjARbl6LW5NNk8SHP70l8jflN5W8oJc/VVkvbi7AWae7 4OeA6IqhVUDx8cAjTl9ods5tURxekR6BkZ8u6D1Swgib+eFBE/0PHxb8cNOB+ay/ziffv97v0Hbr vFc3cT9n+tTyU/2MrSJ/wuNL+YPURP8Amj9FMZ/MTyp5v1byxPY6Drc63kjLzSYxQrJFvzT1IYkd a/Oh6HrgILsOzNZgxZhLLAcPlZ39xJTPyz5f8w2ugWNrrWt3F1qEUQW6eMxcWYeEjRes1BtyLVPX CA4+r1OKWWUscAIk7c/uukz/AMP6aRSX1517pPc3EqH5pI7Kfuxpx/zM+lD3RA+4K1to+kWr87ax t4H/AJ44kQ/eoGFjPPOWxkT8UPZ+WtDsZriaws4bOS7f1LpoEWMyvv8AE/Ebnc4KZz1WSYAlIy4e V9EzAAAA2A2AwuO7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FWFah+c35a6ff3Nheax6V3aSvBcR/VrpuMkTFHWqxFTRh1ByPEHb4+wtXOIlG FxkLHqjyPxQ//K9fyr/6vf8A063n/VHHiDP/AEPa3+Z/so/rTfQvzL8ia7Otvpms28tw+0cDloZG PgqTCNmPsBhEg4uo7K1OEXOBA+f3WybC694Hrf8Azkhrenazf6emj2zpZ3M0CuZJAWETlATTxplZ m9rp/ZbHPHGXHL1AHkOoez+VNZl1vy1pmryxrDJf20c7xKSVUyKDQE5MF5PWYBhzSxg3wkhU13zF oeg2f1zWL2OztyeKtId2b+VEFWdvZQTiSx0+lyZpcOOJkUg/5WjoIT1msNXWzO4vTpt36NKVry4V /DHic3+SMvLix8Xdxxv70/0PzHoevWhu9HvYr2AGjmNviQ/yupoyH2YDEFwtRpcmGXDkiYlE6ldN aaddXSqGa3hklCnoSilqfhhYYocUxHvKG8t6pJq3l3S9VkQRSahaQXTxqSQpmiWQqCew5YAz1WEY ssoD+GRHyNJjhaHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxV5/wD+U88yf9tS9/6iHyk831rs3/Fs f9SP+5DPPLv/ADjzrOt6FYavFq9tDHfwJOkTRuWUOK0JGEQdNqfabHhySxmBPCa6MN8+/l5rvknU YbbUjHLDcqXtLuEko4UgMPiAIZaio98BFO17O7Tx6uBMNiOYL3H/AJx+8+6hr+kXej6pK095pQjM Fw5q8lu9QAx6koVpU9iMnAvH+0nZ0cOQZICoz6ef7U8vbP8AI03twb1vL/1wyObn1ZbUSeryPPmC 1eXKta4dnDxz7R4Rw+Nw1tQlyZjpzaRBpED6c0K6TFCGtngKmAQqtQUK/Dx4+GSdVlGQzPHfHe98 7Yl5G03/ABBOfPWsRerc3hb9A28oqtnZBqRlFOwkmA5s/XenTbIjvdp2hl8AflsZoR+s/wA6XX4D kAzrJOmYL550yDQry1866Ygtbu2uYIdaEfwrdWdxKsL+qo2Z4y4dWPSmRPe7ns/Kc0Tp57xIJj/R kBe3keRDK/MH/HB1L/mFn/5Ntki6zTf3sf6w+9AeQP8AlA/Lf/bLsv8AqHTAOTf2l/jOT+vL/dFO ba8tLpZGtp451ikeGUxsrhZIzxdG4k0ZTsR1GFxJwlHmKvf4KuLFSjvLSS5mtY543ubcI08Cspkj EleBdQaqG4njXrTFkYSAEiNjyPuddXdraW73N3MlvbxCsk0rBEUeLMxAGKwhKRqIsljQ/NX8uTL6 Q8wWfImlTJRa/wCsfh+muDiDsP5H1dX4cvkya2ube6gS4tpUnglHKOaNg6MD3VlqCMLr5QMTRFF5 x+Zfm7ypOvl6KHWrCWW18wafLcxpcws0UcUp9R5AGqqp+0T0yMi77srRZx4hMJAHDOvSd7G1e9m+ m+avLGqXBttM1eyvrkKXMNtcxTPxFAW4ozGgrht0+XR5sYucJRHnEhMZpoYYnmmdYoowWkkchVUD qSTsBhaIxJNDmxn/AJWl+Xf1j0P8Q2XOvGvqjhX/AIyfYp71wcQdh/JGqq/Dl8v0MmhmhmiSaF1l ikAaORCGVgehBGxGF18okGjzWm7tBdizM0Yu2jMy2/IeoY1IUuEry4hmAringlw8VenlfS0jm/ML yRFqa6Y+tWhv3kWFYFkDn1GbiEJWoDctqHBYcyPZmoMOPglw87p8l+f/APlPPMn/AG1L3/qIfKjz fTOzf8Wx/wBSP+5D6J8g/mZ5CsPJWiWV5rdtBdW9nDHPCxPJXVACDt2ywEU8L2l2TqZ6icowJiZF 5l+ff5iaD5nudO0/RJPrVvp5lkmvOJVWeTiAqcgGooXc9D9GQkbeh9nOzMunEp5BRlW3uTn/AJxh 0i5N7rWsMpW1WKO0jc9Gdm9RgP8AVCrX54YOJ7W5xwwx9bv9DyPzh/ylut/8x91/yebIF6jRf3EP 6kfufTWmyPF+Q3qIeLp5dlZT4EWjEZb0fPcovtKj/qw/3TMPLEMcHlvSYYhxjis7dEXwVYlAGEOr 1cic0yesj96ZYXHU7i2t7mFoLmJJoXpzikUOpoaiqmo6jFlGZibBooTzB/xwdS/5hZ/+TbYls039 7H+sPvQHkD/lA/Lf/bLsv+odMA5N/aX+M5P68v8AdFAflv8A7x69/wBt7Vf+opsQ3dqfVj/4Vj/3 LLcLrGJaB/5Mjzb/AMwuk/8AEbnAObs9T/imH+tk/wB6gdetbLW/zMsNF1ik2mWemnUrSwk/up7s zmJmdT8MnpRqCFP81cB5t2nnLFo5ZMe05T4SeojV/Cz9zNXs7N7Y2rwRtbEcTAyKY6eHEimSdSJy B4gTfexfy55WuPLnmu+i0qIxeVdQt/rP1YMvpW9+sgVlhjryVZY25EBeNV7bDAA7HVawZ8ETM3mi avqY11Pkfjulv5naRpKR+W3SygVpfMWmrKyxICyvKeQYgbg98Em/snNMnL6jthn18mbW2laXayer bWcEElKc4o0RqHtVQMk6ieachRJPxYbc2i+dfN17ZXv7zyv5ddIpLP8A3XeagyCRvW/mjgVgOB2L HuMjzdrGf5TBGUf77Lvf82HLbzl39zNDp2ntZ/UjawmyI4m2Ma+lx8OFONPoyTqvFlxcVni7+rC9 Gsf8I+eI9Csqr5d1+Ga5sbSpK2t5bFWmSKv2Y5Eflx8RtkRsXa58n5rTeJL+9xkAn+dE8r8wdkt8 96dqWq/mZo+k2k721tqGl3EOqXER4yLZrcRyyKjD7JkMax18GxPNyOzssMejnOQsxmDEdOKiB8rv 4PQ9K0fS9Jso7LTLWKztYwAkUKhRttU06nxJ3OSdHmzzyy4pkyPm+NfP/wDynnmT/tqXv/UQ+Unm +q9m/wCLY/6kf9yGX6F/zj95y1rRrLVrW905La+hSeFJZZw4VxUBgsLCvyOEQLrNR7SafFklCUZ3 E1yH/FMl0L/nGK/M6tr2rxJbjd4rFWd29hJKqBfnwOEQdfqPayNfuoG/6X6h+t7loWhaVoWlwaXp duttZW4oka9Se7MTuzMdyTlgDx+o1E80zOZuRfGXnD/lLdb/AOY+6/5PNlBfV9F/cQ/qR+59O6Rb S3P5FpbQjlLP5fkjjHiz2rKPxOWjk+eZ5CPaVnkM3++ZV5Su4rzyto91EaxzWVu60/yolNPowh1u tgY5pxPSR+9NcLjITVtW0/SNPl1DUJfQs4OPqy8WenNgi/CgZvtMO2LbhwyyyEIC5FT8wf8AHB1L /mFn/wCTbYlOm/vY/wBYfegPIH/KB+W/+2XZf9Q6YByb+0v8Zyf15f7opf8AluwNr5gX9pNf1QMO lK3BYfgwOIb+1Pqx/wDCsf8AuWXYXVsS0D/yZHm3/mF0n/iNzgHN2ep/xTD/AFsn+9TPzN5R0jzD Hbm79WC8s2MlhqFq5iuYHIoTHIPHuDUHwxIcfSa2eAnhoxlzidwfeEoGl/mbpa/6FrFlrsKDaDUY DbTkDsJ7clS3u0fz8cd3K8bR5PqhLGe+JsfKX60x8r+cIdamu9PubSXS9c0/j9f0ychmUP8AZkjk X4ZY27MMQWjV6I4gJAieOXKQ+4jofJKvzR/ufK//AIEml/8AJ04JOT2Rzy/8Jn9zNck6h5X5U8o6 hqdz5kurfzHqOl117UVltbUxCPksvwt8cbGpj49+mQAek1mtjjGOJxwn+6hub7vf32n/APyr3W/+ p01n/grf/qlhpwv5Tx/6jj/2X61bSvy/mtNdstYvfMGoarLYCUW0N2Yii+unBz8CKenvhphm7SEs cscccICVXV9Pium/8m1Z/wDbBuv+oy3x6oj/AIif+Gx/3MmW4XWPirz/AP8AKeeZP+2pe/8AUQ+U nm+tdm/4tj/qR/3IfV/5Zf8AkvfLv/MBB/xAZbHk+a9rf41k/rlk2F17sVfEfnD/AJS3W/8AmPuv +TzZQX17Rf3EP6kfufW35ZgH8vPLwIqDp8FR/sBl0eT5j2r/AI1k/rlItG1aPyFfP5b1utv5dlle Ty9rD/3CJKxc2c79I2jYngzGjL4UwDZzc+E62PjY98teuPXb+Id99a5Fm51nRxB9YN9bi3py9Yyp wp48q0yVun8DJdcJv3MM1jWYPO+oWugaC31vRre6hude1ZP95uFs4mS2ik6SSSOq8uJoq/hG7dtg wHSROXL6chiRCPXfbiI6AC+fNmHmD/jg6l/zCz/8m2yRdVpv72P9YfegPIH/ACgflv8A7Zdl/wBQ 6YByb+0v8Zyf15f7opBpmqW3lTzlrGlavKtpp2u3H6T0e9mbjE80iKlzAXb4VcOgZV7g4ORc3LhO p08J4xxSxjhkBzq/Sfd3so1fzX5b0e0a61HUYIIlBIBdS7Efsogqzt7KK4bddg0eXLLhhEk/j5MN /LS91XUPOvnDUdRt3s3vY9MmtrST+8jt+NwsIkH7Lsq8mXsTgHN2vauOENPhhA8XCZgnvPpuvLon OpebJPL/AJtlg1+f0PL2oww/oq+dVWCG5Tks0MsgA4mQcXUuadd8NuLi0Yz4AcQvLEniHUjoQPLk aZC2t6Mtublr+2FsByM5mQJTx5VpTDbgDT5LrhN+4sQ8u6jb+ZPzFutf0pPV0Ww01tL/AEkBRLm4 e4SYiI/tpEEI5eJyI3LtdViODSjFP+8lPi4e4VW/daK/NVfS0Cx1VlZ4NF1Ww1G5CAkiGCceo1AC TxVqnGTX2Obyyh1yY5xHvI2ZTaanpt5HHJaXUNwkyh4midXDKRWq0JqMk62eKcCRIEUw29uj5J80 3up3Kv8A4V19klu7lFLrZX6qIy8gWpEU6qtX7MN6DI8na44fm8MYD++x7Afzo89vOPd3Muj1zRZL YXUeoWz2xHITrNGUp48gaUyVusOnyA0Yyv3FAaL5w0fW9TurLSS95BZqDNqUS1tPUJp6KTVo7gfE eNQB3wAt2fQ5MMBKfpMv4f4q766D3pdN/wCTas/+2Ddf9Rlvj1b4/wCIn/hsf9zJluF1iVzeVfLE 8zzTaPZSzSsXkke2iZmZjUsxK1JJwU5EdZmAoTlX9YpjBBBbwpBbxrDDGAscUahVVR0CqNgMLTKR kbJsr8WLsVSuTyp5WlkeWXR7F5HJZ3a2hLMxNSSSu5OCnJGszAUJy/0xTGCCC3hSC3jWGGMBY4o1 CqqjoFUbAYWiUjI2TZauLe3uYXguIkmgkFJIpFDow8CpqDisZGJsGikA/LfyAJfUHl3TuVa/7zRU r/q8aYKDm/ypqqrxJ/6Ysgt7eC3hSC3jSGGMUjijUKqjwCigGFwpSMjZNlc6I6MjqGRgQykVBB2I IOKAaWwwwwQpDCixQxKEjjQBVVVFAqgbAAYrKRJs81HUNM07UrVrTUbWK8tX3aCdFkQkdDxYEYs8 WWeOXFAmJ8tkt03yP5O0y5W60/RLK2uU3SeOCMOv+q1Kj6MFByMvaGoyDhlORHvKbpb26TyTpEiz yhVllCgO4SvEM3U8eRpXC4pkSKvYOuLe3uYXguIkmgkFJIpFDow8CpqDisZGJsGikA/Lb8vxJ6g8 u6dyry/3mipXr9njTBQc3+VNVVeJP/TFkEMMMMSQwosUUYCxxoAqqB0AA2AwuDKRJs81zojoyOoZ GBDKRUEHYgg4qDSUaZ5N8p6Vem+03SLSzuyGX14IUjYBvtAFQKV9sFOTl12fJHhnOUo+ZTd0R0ZH UMjAhlIqCDsQQcLjA0x5vy58gtMZm8u6cXJ5H/RoqE/6vGn4YKDnDtTUgV4k/wDTFPre3t7aFILe JIYIxSOKNQiKPAKKAYXClIyNk2XG2tzcC5MSfWVQxifiOYQkMU5deJIBpivGaq9lTFi7FXYq7FXY qwbXdG8yy32txWayGz10rbSvzAEMUVrFWSMVBUzD1oeQ3D8D0BOKqOnxeeJ7oWcr3tnaCRUlkHoH jHHKoHpuUH24h+zyoD9rmDiqzUL7z1Z3YLNcfVIIYl1G8f6sqeksEbzXEfJY41m9T1FVfiFa8qKU GKrvLF55sv76yuRqNw+jNLceh6trHJ9YhW7uk/fTI8YjpCIeB4VIp9olxiqrJpms20rzaTZS2179 au5dSvYxEpmtZr5iI1WQ8ZZvRb1I3ZSFpxr8VMVbjHm+Zmhn+vGOSKYWKulsI3ib6wF+uEAMsnH0 aUofs9/VGKoSeP8AM2Rpwb2a1ufqk6wxQ20E0L3JScFlmZl4BZDE0QdD8IQGrGUYqyDWV8wwXlnD YyXUkSpGsMiLC6POJB6hvGYchH6XdKftU+PgMVSeGLz3PHIUub+KKGylli+sJZpNJqSKv7pgishg LkladwaH0+OKqeoHzjDc/VtLjvZYvXZX+scHRke7cSn40A4i34sp9T9r4VqHoqrzWXnqLSFkivp4 ppZJBdRCGGYwwLdIE+rxp6ZJ9ANUcuVCePxhBiqjdRee4LB5ze311dNNEIVjgt4uaJZRihUeqIWk uS7ksHWo4txTFU784WJv7e2ZrR51heUiGS3W7hL0Ma+rb8kY8gTwdWBXueJOKpXZaZ5ya1QNNcaa Y2gH1WFreVeMuoTfWuUjozOy2rIeda1+L7XKqqAkPm+8bWdNaS9uXje7sijLbi2a2+oP6Ls4VT60 krxMaH9rYU50VZJ5R1DVbx703chmt7aR7G2nXgyTfVJGDXHJKfHL6gRlpQNG2KskxV2KuxV2Kv8A /9k= + + + + + + uuid:65b4c2db-c9fd-0942-a2bc-500550c26e8b + xmp.did:0180117407206811822A82F25FD51E43 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:ba5dc92b-6d0a-484a-ab90-b9370a4a0965 + xmp.did:0980117407206811822A897E387FE54C + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:0180117407206811822A82F25FD51E43 + 2017-07-27T00:02:55-05:00 + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + True + 1 + + 5.958028 + 7.957933 + Inches + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 189 0 R/TrimBox[0.0 0.0 428.978 572.971]/Type/Page>> endobj 182 0 obj <>stream +HWI$+\Utz@A#jȥ:3ro۷O~.]VZt-ǎ߾u˷w}|߼ko1m`/m -|i_/!y|s#`͍ܶ0\ q8.1Җ]K}吷BˇB)&` WT2u \jܦѻh ̞~^a6';;t8Z^F)K#n޺2Ko:Bǩ[!!N96?܃rӺWKDAN{r%xDe/`8Rs^ +n/'\.(.x +3np7 %OVyE8h*]0gG|3 X #“D%tܘDMB qsez9t䀟 %]y]&>|ft=g4pG+ ++YG6sJ{V$st Hr|f$y;ހƤMՀ4DLQD:O 5'Z 0vl4 )gvZZ[^"2,SKF"Λ6n pz i-}BmʖNp`6= DE@Pâ!kv 5D ]=8(ʠby;BCJ;3 g*dъXq>zz":K)fFlX|Ũn7R^6 +?U @A]@ )cw+5XG܂3> $r6}T`QNDݮvMӸQ ,EXF\NB:BbN6%JNR镁q5{ξ\ijFZaMXӨrɂ1{rac|6qAe+gL2K.!}|2LvFSw`'J":hl5]/?A@ Σj.PNĵ/ |de29f KSѷh<͊j3yNU48$HD|5D+lE3@xu[JXq^?Q#" D(VQ:y໅Vvݷ +r, mҤWcbM3) Nk>.]4v>|9@6Z; .A9u{":\nc' 0AH.!J"x$@70γgQg'}z~5RF~7Km1F2GgV :̏5rD>/=7(-L\}b~Va Ur4>QXޖY$ZJ;΁>lDC4\^MËaxjS8Z\ +lV8AkQؼ$secO. +>D7Hc +VD??q +r|gfQgjIF{]@4c|9E{fGLf@%K;Q,dee]X c?X5t ㍹-SڂfpTC+꫎%%ѫ͗LEncv5>f+sa<]'O`?堒S_+s;5v6СLB)8x|mcڶZ>Zz0pxLl+h^wXX`yR5H*o wp{ȏ{(al>\1wxJp?s{ pn>t W3 [AA+C(TtADo_)4R}3_z/纅Eq&~"ϾJWJ^{a=>3q] 8N| z!oS* >ҴQl +օô1ߴp;Mعn8ܟ2r5沅\ ȷ } +&V4ܓ|hns;5M)< + 5G}< O'ùM0Ow);߂X'dFLJ7%s˃Kum>f\4ӐjMAamBȠz +,<健+2?f9>t) ;W3 =WSEnKK ?pr6~D{F*c8~74s.[Fx.TBAH>s8hdAaTl1ݖ9m>nWA +A\MyKe)aY,-ov}B v!DD^SӸ_`[>a({1bt,Bo !oD$@>(|bMܹm%A#!N[ϨUBJ[Y]X*sk%<}`& !fBp[KӅ`:=l9/(58,7œ Y>X{3"25V`Iwڣ֯Q1?/Bw}RӔV԰mR%b :R>Lma[݇)Iu=(L$k$" +ckLƹM&|*>88ae~"G,A=xy[uejy`)v +]N0m71ܖ)mms9p|+M= W׳5Ɵ13S;fy zz,8B(oLeVTjϸ= vaSx9_~O?7?x>gOlpgjj/K?ٝ/<'yH1ꫪ|$}M`}?} +~Y0l=bB(s[YFzy2#mgn`4-f`^ڀoF'H)c!Qؔ_ +IQqOԪ`XY}숥xk@q7W=N}uɉ aϗ'Z&VOA 'UN GKt3 aI9B}kSiy8Ƚb2b4m U;`j2[*f.u!!zꀖ jҁ1|ya=C sq?q/ Ta 2L35˳5jI0AP!,T Cr}X͸zQjm:⸍HĂq9ƁZ(_v‰gr|@'"te]y#49wΥ{H vZG"c%<ה 4 !RѫnUh)Pv<1&v+cl0 "`|hQ@յ11g*c`dV#}Xf zKjLZZxiP41G0qU$#a蚈TH52ռ%~PA?#?2I>^[&Fu2tl"p1] L0 /LbY0?vT<>PVe] ; m|HR!L@t{ $q[H >PkðIV)FH{0O(U)E'Lve4 +F;:3 2Ax|0z+)"JQYJ:!މ-zS͌K,+~"#3TxܠzOvըT Z;g#ϔ` ]1+)庱@JQGQբ(%Xݥ[*93ѫyd5OCy> fq ̻QyJNQN@u1P+tW3#OYYbHH"OTs*+&rR;zCqe{qqc`g*:kELBۿ׉vДBY Y36R5ќ-g<P7:!ݮjv_@eV.p &^k2(1gND1U =9UB < _i7 +0S.)GPM?QnldJIk)#ڥ>SW .dⷝg2 MۺډwN h +aEZ'FvAsirH-m^XSIUEܳR+@&7_Zpckxw;\` +tm ul>TDfٸ ,zVųfuG.ssN!aXk!e,=.PX|CKtET*2+ 'E@1>yڈaڬ\$$ra}nZyZx :N;N!^R[K_^AVݩiCjP}G[[ .~cSr08=X1N& +![qa 87<,BtXp!BMzdG [T;!#XC84-W]ɤ{kt_ЄH9YbQV)~$Ow %p'5T`t\LNFO=/EA?Xkm#|f +ʂp,5FW0 9VlNhʌ׊~q) ƳH֎/ٶi:TyH Ҭ|] g3g\5.GB8Q?&Ϻb>w(UJzXZc͑[^ dz;[?!ߢZTtGdZ6|;0M2oU9oj&m Oެ߼`+ ,KT]KN| qjWEL!s2Rl5[g6}8gL'c'`%g)pTP;Hbq59)`zeh4)r _G5֢0eqd-&^% dX3]<=~9ˌW" 6`bs8 $ Đ;/yy[ RG~sBk քdʱ0#wt .eC7Jbz bTϤf0e)pZ XQ; +"0!*?ʌ*Iԝߥ & ;1Yc{Il:57b,^"KU QKR?C hTS)tvZK>n6h\r",zLV&V0 IAJƺeةey͓[#N'S+;'< dh6rԭPOHyrBMRejD 0hD)tDJz&" TIP%@xrElq#-b CΡ-] E/{p#҆ K PN~;pW޵@2u$÷=1ՠС< ]E$[k.mpi#Vd(2䵄FAO1rl7n x]@zhl ~}S )9X@Őig"L _=l$9X& %"qgԁo3>44+,;g/S82o8$*ho~zsQTukʅ{U@3lkr'(% NS&qS_zM^X>WgOPSQfI:AG0EBFY$n>I +PJ<]U1 OĀ-Tt\j) +ũd~KJ`wZjWԵrA`ՅfUyi]D+k'9]~i6Y)8!Dq[:Lz y\ \r}T׿/TPg}<' +G7IS&DJE_2vHLt?Vg"P=c5zhykvռ$+ԓӖ/[d&E(6(׼um{6qP_K"%iFϠivf"\kauj覄 _Y4*nu7j~6м;笟 `|*{>`tKre_o/0Ր]lBۀ؏_ZXeJ lё '$X'k^C6oX,&m2 io0Hvur3++JA' +>ξ툫9aiNrܽZEj. ^,WƸLGPs[`N@[%8a׹)==ݕä{`>+2,$;R:{\|\Ҹ|&wQ[F{EY Hq! wM2"nv qɤ To'NaS(wZ-O%Rmʰ l;EoBԅښgړ͝ޝn1PώnKU.w_k01i' e'ئި^𺰊 iϿu +0B i endstream endobj 183 0 obj <> endobj 189 0 obj <>stream +8;YPkbB:]V%-tbKL,TR(@H8*RWP_ +E&CQG&.*W@H[+^+Z/t:2HjuU%4'p)94n`LjpF9-e5)hW'F,TrQ1BCO/6qMlCBTZn&Uacu'&>B22M!8:U<6(3 +:nJ2,r"&6qN;4/J6&oo>%ZLbc_bai'u?=LSe<m\;%kLC-mb +_S7l#'SirP3?.,pldV$sdFHp.o7EuWft"'9H>]5sASk?">"quYWnl49VK^BWdQMUR +W9hJ0+8)R)GdZpL]).cnhi50nG7*Il&s9G:j4(U9,TnkAdQ".2U"PRqIl`5=N(&e; +Ht;j+7b/a/-Muk>16pRVH1gg/G4r2jIJ0b?RVE@ekMqYrV2r\UVuhsS*Fj4TT/O*# +T90i(eqf_"IQIst>9[3";k?qNln(@^0M/+L,L)!q&*;P"\\9,VNA;[4U,nSG:\1VX +El!Z:ec2/S/c%utlc%5fc]#U+N+Db,iU endstream endobj 191 0 obj [/Indexed/DeviceRGB 255 192 0 R] endobj 192 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 188 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 0.788 0 0.227 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 213.3315 543.0239 cm +0 0 m +90.649 -22.663 l +-0.001 -60.434 l +0 0 l +h +S +Q +q 1 0 0 1 273.7642 422.1562 cm +0 0 m +30.217 98.205 l +-60.434 60.434 l +0 0 l +h +S +Q +q 1 0 0 1 387.0786 422.1562 cm +0 0 m +-83.098 98.205 l +-113.314 0 l +0 0 l +h +S +Q +q 1 0 0 1 213.3306 422.1562 cm +0 0 m +-60.434 60.434 l +0 60.434 l +0 0 l +h +S +Q +q 1 0 0 1 77.355 482.5898 cm +0 0 m +75.542 52.88 l +135.976 0 l +0 0 l +h +S +Q +q 1 0 0 1 213.3315 543.0239 cm +0 0 m +-60.435 -7.554 l +-0.001 -60.434 l +0 0 l +h +S +Q +q 1 0 0 1 394.6333 361.7222 cm +0 0 m +-60.436 60.434 l +-7.555 60.434 l +0 0 l +h +S +Q +q 1 0 0 1 213.3306 482.5898 cm +0 0 m +120.867 -120.867 l +60.434 -120.867 l +0 0 l +h +S +Q +q 1 0 0 1 213.3315 361.7227 cm +0 0 m +60.433 0 l +-0.001 120.867 l +0 0 l +h +S +Q +q 1 0 0 1 334.1978 422.1562 cm +0 0 m +-30.217 -30.217 l +-60.434 0 l +0 0 l +h +S +Q +q 1 0 0 1 334.1978 361.7227 cm +0 0 m +0 60.434 l +-30.217 30.217 l +0 0 l +h +S +Q +q 1 0 0 1 394.6333 361.7222 cm +0 0 m +-60.436 60.434 l +-60.436 -60.434 l +-60.436 -98.205 l +0 0 l +h +S +Q +q 1 0 0 1 273.7642 331.5054 cm +0 0 m +60.434 -30.217 l +60.434 30.217 l +0 0 l +h +S +Q +q 1 0 0 1 213.3315 361.7227 cm +0 0 m +120.866 0 l +90.649 -45.326 l +0 0 l +h +S +Q +q 1 0 0 1 152.897 482.5898 cm +0 0 m +-60.434 -120.867 l +60.434 -60.434 l +0 0 l +h +S +Q +q 1 0 0 1 77.355 482.5898 cm +0 0 m +15.108 -120.867 l +75.542 0 l +0 0 l +h +S +Q +q 1 0 0 1 334.1978 301.2886 cm +0 0 m +-60.434 -60.434 l +-120.867 60.434 l +0 0 l +h +S +Q +q 1 0 0 1 213.3306 210.6377 cm +0 0 m +0 151.085 l +60.434 30.217 l +0 0 l +h +S +Q +q 1 0 0 1 334.1978 263.5176 cm +0 0 m +52.881 37.771 l +37.771 60.434 l +0 0 l +h +S +Q +q 1 0 0 1 394.6333 361.7222 cm +0 0 m +-22.664 -37.771 l +-7.555 -60.434 l +0 0 l +h +S +Q +q 1 0 0 1 334.1978 263.5176 cm +0 0 m +-60.434 -75.542 l +-60.434 -22.663 l +0 0 l +h +S +Q +q 1 0 0 1 334.1978 225.7461 cm +0 0 m +52.881 75.542 l +0 37.771 l +0 0 l +h +S +Q +q 1 0 0 1 273.7642 187.9756 cm +0 0 m +60.434 75.542 l +60.434 37.771 l +0 0 l +h +S +Q +q 1 0 0 1 213.3306 301.2886 cm +0 0 m +-120.867 60.434 l +-60.434 60.434 l +0 0 l +h +S +Q +q 1 0 0 1 152.897 391.9399 cm +0 0 m +60.434 -90.651 l +S +Q +q 1 0 0 1 92.4634 361.7227 cm +0 0 m +-52.88 -60.434 l +-60.434 15.108 l +0 0 l +h +S +Q +q 1 0 0 1 77.355 482.5898 cm +0 0 m +-15.108 -60.434 l +15.108 -120.867 l +0 0 l +h +S +Q +q 1 0 0 1 39.5835 422.1562 cm +0 0 m +37.771 60.434 l +22.663 0 l +0 0 l +h +S +Q +q 1 0 0 1 152.897 301.2886 cm +0 0 m +-75.542 -60.434 l +-83.097 37.771 l +0 0 l +h +S +Q +q 1 0 0 1 32.0298 376.8311 cm +0 0 m +7.554 45.325 l +60.434 -15.108 l +37.771 -37.771 l +120.867 -45.326 l +181.301 -166.193 l +120.867 -75.542 l +120.867 -135.977 l +45.325 -135.977 l +83.096 -166.193 l +120.867 -135.977 l +181.301 -166.193 l +S +Q +q 1 0 0 1 213.3306 255.9634 cm +0 0 m +-37.771 30.217 l +S +Q +q 1 0 0 1 39.5835 301.2886 cm +0 0 m +37.771 -60.434 l +S +Q +q 1 0 0 1 160.4517 187.9756 cm +0 0 m +-45.326 22.662 l +52.879 22.662 l +113.313 0 l +52.88 -7.555 l +52.879 22.662 l +0 0 l +52.88 -7.555 l +S +Q +/CS0 cs 0.788 0 0.227 scn +q 1 0 0 1 384.0562 422.1562 cm +0 0 m +0 -1.669 1.353 -3.022 3.022 -3.022 c +4.69 -3.022 6.044 -1.669 6.044 0 c +6.044 1.669 4.69 3.022 3.022 3.022 c +1.353 3.022 0 1.669 0 0 c +f +Q +q 1 0 0 1 328.7593 422.1562 cm +0 0 m +0 -3.004 2.435 -5.439 5.438 -5.439 c +8.443 -5.439 10.878 -3.004 10.878 0 c +10.878 3.004 8.443 5.439 5.438 5.439 c +2.435 5.439 0 3.004 0 0 c +f +Q +q 1 0 0 1 387.0786 361.7222 cm +0 0 m +0 4.172 3.383 7.555 7.555 7.555 c +11.728 7.555 15.11 4.172 15.11 0 c +15.11 -4.173 11.728 -7.556 7.555 -7.556 c +3.383 -7.556 0 -4.173 0 0 c +f +Q +q 1 0 0 1 326.644 361.7227 cm +0 0 m +0 4.172 3.382 7.554 7.554 7.554 c +11.727 7.554 15.108 4.172 15.108 0 c +15.108 -4.172 11.727 -7.555 7.554 -7.555 c +3.382 -7.555 0 -4.172 0 0 c +f +Q +q 1 0 0 1 298.5425 391.9399 cm +0 0 m +0 -3.004 2.435 -5.439 5.438 -5.439 c +8.443 -5.439 10.878 -3.004 10.878 0 c +10.878 3.004 8.443 5.439 5.438 5.439 c +2.435 5.439 0 3.004 0 0 c +f +Q +q 1 0 0 1 258.6567 422.1567 cm +0 0 m +0 -8.344 6.764 -15.108 15.107 -15.108 c +23.452 -15.108 30.217 -8.344 30.217 0 c +30.217 8.344 23.452 15.108 15.107 15.108 c +6.764 15.108 0 8.344 0 0 c +f +Q +q 1 0 0 1 205.7769 422.1567 cm +0 0 m +0 -4.172 3.382 -7.554 7.554 -7.554 c +11.726 -7.554 15.108 -4.172 15.108 0 c +15.108 4.172 11.726 7.554 7.554 7.554 c +3.382 7.554 0 4.172 0 0 c +f +Q +q 1 0 0 1 77.355 361.7227 cm +0 0 m +0 -8.344 6.764 -15.108 15.108 -15.108 c +23.452 -15.108 30.217 -8.344 30.217 0 c +30.217 8.345 23.452 15.108 15.108 15.108 c +6.764 15.108 0 8.345 0 0 c +f +Q +q 1 0 0 1 65.2681 339.0601 cm +0 0 m +0 -2.503 2.029 -4.532 4.532 -4.532 c +7.036 -4.532 9.065 -2.503 9.065 0 c +9.065 2.503 7.036 4.533 4.532 4.533 c +2.029 4.533 0 2.503 0 0 c +f +Q +q 1 0 0 1 145.3433 361.7227 cm +0 0 m +0 -4.172 3.382 -7.554 7.554 -7.554 c +11.726 -7.554 15.108 -4.172 15.108 0 c +15.108 4.172 11.726 7.554 7.554 7.554 c +3.382 7.554 0 4.172 0 0 c +f +Q +q 1 0 0 1 149.8755 391.9399 cm +0 0 m +0 -1.669 1.353 -3.022 3.021 -3.022 c +4.69 -3.022 6.043 -1.669 6.043 0 c +6.043 1.668 4.69 3.021 3.021 3.021 c +1.353 3.021 0 1.668 0 0 c +f +Q +q 1 0 0 1 56.8071 422.1562 cm +0 0 m +0 3.004 2.435 5.439 5.439 5.439 c +8.443 5.439 10.879 3.004 10.879 0 c +10.879 -3.004 8.443 -5.439 5.439 -5.439 c +2.435 -5.439 0 -3.004 0 0 c +f +Q +q 1 0 0 1 35.0503 422.1567 cm +0 0 m +0 -2.503 2.03 -4.533 4.533 -4.533 c +7.037 -4.533 9.066 -2.503 9.066 0 c +9.066 2.503 7.037 4.532 4.533 4.532 c +2.03 4.532 0 2.503 0 0 c +f +Q +q 1 0 0 1 25.9858 376.8311 cm +0 0 m +0 -3.337 2.706 -6.043 6.044 -6.043 c +9.381 -6.043 12.087 -3.337 12.087 0 c +12.087 3.338 9.381 6.044 6.044 6.044 c +2.706 6.044 0 3.338 0 0 c +f +Q +q 1 0 0 1 32.0298 301.2891 cm +0 0 m +0 -4.172 3.382 -7.554 7.554 -7.554 c +11.726 -7.554 15.108 -4.172 15.108 0 c +15.108 4.172 11.726 7.554 7.554 7.554 c +3.382 7.554 0 4.172 0 0 c +f +Q +q 1 0 0 1 71.9155 240.8545 cm +0 0 m +0 -3.004 2.435 -5.439 5.439 -5.439 c +8.443 -5.439 10.879 -3.004 10.879 0 c +10.879 3.005 8.443 5.439 5.439 5.439 c +2.435 5.439 0 3.005 0 0 c +f +Q +q 1 0 0 1 147.4575 301.2886 cm +0 0 m +0 -3.004 2.436 -5.439 5.439 -5.439 c +8.443 -5.439 10.879 -3.004 10.879 0 c +10.879 3.004 8.443 5.439 5.439 5.439 c +2.436 5.439 0 3.004 0 0 c +f +Q +q 1 0 0 1 172.5386 286.1802 cm +0 0 m +0 -1.669 1.353 -3.021 3.021 -3.021 c +4.69 -3.021 6.042 -1.669 6.042 0 c +6.042 1.669 4.69 3.021 3.021 3.021 c +1.353 3.021 0 1.669 0 0 c +f +Q +q 1 0 0 1 149.8755 240.8545 cm +0 0 m +0 -1.669 1.353 -3.021 3.021 -3.021 c +4.69 -3.021 6.043 -1.669 6.043 0 c +6.043 1.669 4.69 3.021 3.021 3.021 c +1.353 3.021 0 1.669 0 0 c +f +Q +q 1 0 0 1 106.061 210.6377 cm +0 0 m +0 -5.007 4.059 -9.064 9.064 -9.064 c +14.071 -9.064 18.13 -5.007 18.13 0 c +18.13 5.007 14.071 9.065 9.064 9.065 c +4.059 9.065 0 5.007 0 0 c +f +Q +q 1 0 0 1 156.8247 187.9756 cm +0 0 m +0 -2.003 1.624 -3.627 3.627 -3.627 c +5.629 -3.627 7.253 -2.003 7.253 0 c +7.253 2.002 5.629 3.626 3.627 3.626 c +1.624 3.626 0 2.002 0 0 c +f +Q +q 1 0 0 1 209.1001 180.4209 cm +0 0 m +0 -2.336 1.894 -4.23 4.23 -4.23 c +6.567 -4.23 8.461 -2.336 8.461 0 c +8.461 2.336 6.567 4.23 4.23 4.23 c +1.894 4.23 0 2.336 0 0 c +f +Q +q 1 0 0 1 203.6616 210.6377 cm +0 0 m +0 -5.34 4.329 -9.669 9.669 -9.669 c +15.009 -9.669 19.339 -5.34 19.339 0 c +19.339 5.341 15.009 9.669 9.669 9.669 c +4.329 9.669 0 5.341 0 0 c +f +Q +q 1 0 0 1 266.2104 187.9756 cm +0 0 m +0 -4.173 3.382 -7.555 7.554 -7.555 c +11.727 -7.555 15.108 -4.173 15.108 0 c +15.108 4.172 11.727 7.554 7.554 7.554 c +3.382 7.554 0 4.172 0 0 c +f +Q +q 1 0 0 1 258.6567 240.8545 cm +0 0 m +0 -8.344 6.764 -15.108 15.107 -15.108 c +23.452 -15.108 30.217 -8.344 30.217 0 c +30.217 8.345 23.452 15.109 15.107 15.109 c +6.764 15.109 0 8.345 0 0 c +f +Q +q 1 0 0 1 329.9683 263.5176 cm +0 0 m +0 -2.336 1.894 -4.23 4.229 -4.23 c +6.567 -4.23 8.46 -2.336 8.46 0 c +8.46 2.336 6.567 4.23 4.229 4.23 c +1.894 4.23 0 2.336 0 0 c +f +Q +q 1 0 0 1 381.6392 301.2891 cm +0 0 m +0 -3.004 2.435 -5.439 5.439 -5.439 c +8.443 -5.439 10.878 -3.004 10.878 0 c +10.878 3.004 8.443 5.439 5.439 5.439 c +2.435 5.439 0 3.004 0 0 c +f +Q +q 1 0 0 1 331.1763 225.7461 cm +0 0 m +0 -1.669 1.354 -3.021 3.021 -3.021 c +4.691 -3.021 6.044 -1.669 6.044 0 c +6.044 1.669 4.691 3.021 3.021 3.021 c +1.354 3.021 0 1.669 0 0 c +f +Q +q 1 0 0 1 300.9595 316.397 cm +0 0 m +0 -1.669 1.354 -3.021 3.021 -3.021 c +4.691 -3.021 6.044 -1.669 6.044 0 c +6.044 1.669 4.691 3.021 3.021 3.021 c +1.354 3.021 0 1.669 0 0 c +f +Q +q 1 0 0 1 269.5337 331.5054 cm +0 0 m +0 -2.336 1.895 -4.23 4.23 -4.23 c +6.567 -4.23 8.461 -2.336 8.461 0 c +8.461 2.336 6.567 4.23 4.23 4.23 c +1.895 4.23 0 2.336 0 0 c +f +Q +q 1 0 0 1 198.2222 361.7227 cm +0 0 m +0 -8.344 6.764 -15.108 15.108 -15.108 c +23.453 -15.108 30.218 -8.344 30.218 0 c +30.218 8.345 23.453 15.108 15.108 15.108 c +6.764 15.108 0 8.345 0 0 c +f +Q +q 1 0 0 1 210.3091 301.2891 cm +0 0 m +0 -1.669 1.353 -3.022 3.021 -3.022 c +4.69 -3.022 6.043 -1.669 6.043 0 c +6.043 1.669 4.69 3.021 3.021 3.021 c +1.353 3.021 0 1.669 0 0 c +f +Q +q 1 0 0 1 207.5894 255.9634 cm +0 0 m +0 -3.17 2.57 -5.741 5.741 -5.741 c +8.913 -5.741 11.482 -3.17 11.482 0 c +11.482 3.17 8.913 5.741 5.741 5.741 c +2.57 5.741 0 3.17 0 0 c +f +Q +q 1 0 0 1 147.4575 482.5898 cm +0 0 m +0 -3.004 2.436 -5.439 5.439 -5.439 c +8.443 -5.439 10.879 -3.004 10.879 0 c +10.879 3.004 8.443 5.439 5.439 5.439 c +2.436 5.439 0 3.004 0 0 c +f +Q +q 1 0 0 1 69.8003 482.5903 cm +0 0 m +0 -4.172 3.382 -7.554 7.555 -7.554 c +11.727 -7.554 15.108 -4.172 15.108 0 c +15.108 4.172 11.727 7.554 7.555 7.554 c +3.382 7.554 0 4.172 0 0 c +f +Q +q 1 0 0 1 137.7886 531.6924 cm +0 0 m +0 -6.258 5.073 -11.331 11.331 -11.331 c +17.59 -11.331 22.663 -6.258 22.663 0 c +22.663 6.258 17.59 11.332 11.331 11.332 c +5.073 11.332 0 6.258 0 0 c +f +Q +q 1 0 0 1 205.7769 543.0239 cm +0 0 m +0 -4.173 3.382 -7.555 7.555 -7.555 c +11.728 -7.555 15.11 -4.173 15.11 0 c +15.11 4.172 11.728 7.555 7.555 7.555 c +3.382 7.555 0 4.172 0 0 c +f +Q +q 1 0 0 1 210.3091 482.5898 cm +0 0 m +0 -1.668 1.353 -3.021 3.021 -3.021 c +4.69 -3.021 6.043 -1.668 6.043 0 c +6.043 1.669 4.69 3.022 3.021 3.022 c +1.353 3.022 0 1.669 0 0 c +f +Q +q 1 0 0 1 297.938 520.3613 cm +0 0 m +0 -3.338 2.706 -6.043 6.043 -6.043 c +9.381 -6.043 12.087 -3.338 12.087 0 c +12.087 3.337 9.381 6.043 6.043 6.043 c +2.706 6.043 0 3.337 0 0 c +f +Q +q 1 0 0 1 328.1548 301.2886 cm +0 0 m +0 -3.338 2.706 -6.043 6.043 -6.043 c +9.381 -6.043 12.088 -3.338 12.088 0 c +12.088 3.338 9.381 6.043 6.043 6.043 c +2.706 6.043 0 3.338 0 0 c +f +Q +q 1 0 0 1 368.9478 323.9512 cm +0 0 m +0 -1.669 1.354 -3.021 3.021 -3.021 c +4.691 -3.021 6.043 -1.669 6.043 0 c +6.043 1.669 4.691 3.022 3.021 3.022 c +1.354 3.022 0 1.669 0 0 c +f +Q +q 1 0 0 1 270.7427 361.7227 cm +0 0 m +0 -1.669 1.354 -3.022 3.021 -3.022 c +4.691 -3.022 6.044 -1.669 6.044 0 c +6.044 1.668 4.691 3.021 3.021 3.021 c +1.354 3.021 0 1.668 0 0 c +f +Q +q 1 0 0 1 142.6235 331.5054 cm +0 0 m +0 -5.674 4.6 -10.274 10.273 -10.274 c +15.947 -10.274 20.548 -5.674 20.548 0 c +20.548 5.674 15.947 10.274 10.273 10.274 c +4.6 10.274 0 5.674 0 0 c +f +Q + endstream endobj 193 0 obj <> endobj 186 0 obj <> endobj 185 0 obj [/ICCBased 194 0 R] endobj 194 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 180 0 obj <> endobj 195 0 obj [/View/Design] endobj 196 0 obj <>>> endobj 187 0 obj <> endobj 184 0 obj <> endobj 197 0 obj <> endobj 198 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Adam Balla) () %%Title: (PiCluster_1A.ai) %%CreationDate: 7/27/17 5:57 PM %%Canvassize: 16383 %%BoundingBox: 120 -579 499 -72 %%HiResBoundingBox: 120.5869 -578.4043 498.7383 -72 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 94.6011 -622.5791 523.5791 -49.6079 %AI3_TemplateBox: 306.5 -396.5 306.5 -396.5 %AI3_TileBox: 3.08984 -732.0938 615.0898 59.9063 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -524 146 0.6667 1229 653 18 0 0 6 134 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 -792 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 199 0 obj <>stream +%%BoundingBox: 120 -579 499 -72 %%HiResBoundingBox: 120.5869 -578.4043 498.7383 -72 %AI7_Thumbnail: 96 128 8 %%BeginData: 14712 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD2EFFBD8D94CAFD5BFFCA8D8D689BFD0DFFCAA8FD3CFFCBFFCBFD %09FFCBFFCACAA18D8D8D94CBCACAA8CACAFFCAFFFFFFCABD8D8D94FD3AFF %CACBA8FFCAFFCBFFFFFFA8CAA1CAA1CBCAFF9B9494FFFFFFCAFFA8FFA8CA %A2CAA89A688D8D8D9AFD3AFFCAFFFFFFCAFFCACAC4CACAFD07FFC4FD0DFF %8D948D948DB6FD3AFFCBA8CAA1C4A1CBCAFD0AFFC4CAFD0BFFA18D698D8D %8D93FD34FFA29494FFCACAC4C4A2CBFD0EFFA1FD0BFFA1CAC4FD048DC3CA %FD33FF94688D94FFA8FFFFFFCAFFFFFFA8FD0AFFC4A8FD09FF9BCAFFFFA1 %9A94CAFFCAA1CACAFD30FF9B8D93C4A1FD13FFA1FD09FF9BCAFD0AFFC3CA %FD2FFFCACAA1C3FFCBA1C4A2FD07FFCBFD08FFC4A8FD06FFCB9BFD0DFFA2 %C4CAFD2CFFCACAFFFFA1FFFFFFCBCAA1C4CAFD0DFFC3FD06FFCB9BFD0FFF %CAC4CAFD2AFFCAC4A8FFFFCAA1FD05FFA8C39BCAFD04FFCAFD06FFC4CAFD %04FFCA9BFD05FFCAFFCAFD0AFFCAA1FD29FFCACAFFFFFFCAC4FD08FFC4C4 %A2FD09FFC4FD04FFCAA1FD14FFCBC4FD27FFCACAFD05FFA1FD0AFFCA9BC4 %CAFD06FFC4CAFFFFC4A1FD17FFA2CAFD24FFCAA8FD06FFCAA8FD0BFFCACA %A1CACAFFFFFFA1FFFFC3A2FD19FFCACACAFD1CFFA8FD04FFCBA1FD07FFA8 %C4FD04FFCAFD09FFA1C3A1CAFFCAA8C3A2FFCAFD09FFA8CAFD0CFFCBFFCA %CAA19B94CAFD17FFCBFFCBFFFFFFC4FD09FFA1FFFFFFCAFD0CFFCBA1C49A %BDCAFFCAFFCBFFCAFFCBFFCAFFC48D8DCAFFFFCAFFCBFFCAFFCBFFCAFFCA %FFCAB68D8D8DFD18FFA8FFCAFFA1FFFFFFCAFFFFFFCAFFFFC4A2FFCBFFA8 %FFFFFFCAFFFFFFCAFD05FFA28D9BCAA1C4A1CAA1C4A1CAA1C4A2BD688D9A %CAA1C4A1CAA1C4A1CAA1C4A1CAA1C4FD048DA8FD18FFCAFFC4FD0BFFCAC4 %FD10FFCABD94FD0DFF9BC394FD10FFCA8D8D9BFD18FFCAFFA1CBFD0CFFA1 %FFCAFFFFFFA8FD09FFA89B9BC4A8FFA8FD09FF9ACAFFCAA1FFA8FD0EFFC4 %9AC4FD19FFC4CBFD0DFFC4CAFD0DFFCAC3A2CAC4FD0BFF9BCAFFFFFFC4CA %FD0FFFC4CAC4CAFD15FFCBFFA8CAFD0EFFA8C4FD06FFCBFD05FFA8BDCBC4 %CBCACAFD09FF9ACAFD04FFA8C4FD0FFFC4A2CAA8CBFD15FFCACAFD10FFA1 %FD0BFFCABDFFCBC4FFA1FD09FF9BCAFD06FFA1FD0FFFA1FFA1FFC4FD12FF %CAFFCAC4FD11FFC3CAFD07FFCAFFA8BDCAFF9BFFFFC4A8FFCAFD05FF9ACA %FD07FFCAA1FD0DFFA8C4FFC3A8CAA2FD13FFCACAFD11FFCACAFD08FFCAC3 %FFFFCACAFFFFA1FD07FF9BCBFD09FFC4CAFD0DFFC4FFA2CBFFCACBFD11FF %CACAFD13FFA1FD07FFCA9BA8FFFFC3CAFFFFC4A8FD05FF9ACAFD08FFCAFF %A8C4FD0CFFA8CAFFCAA1FFCACAFD10FFCACAFD14FFC4FD06FFCAC3FFFFFF %CAC4FFFFFFC3FD05FF9BCAFD0CFFA1FD0CFFCACAFFFFC4FFFFCACBFD0EFF %CAA2FFA8FFFFFFA8FD0BFFA8FFFFFFA1CAFD04FFA89BA8FFFFFF9BFD04FF %C4CAFFFFFF9ACAFD04FFA8FD05FFCBFFFFCAA1FD0BFFA1FFFFFFA1FFFFFF %A1FD0EFFC4FD17FF9BCAA2FFCAC3CBFFFFFFCACAFD04FFC4FFFFFF9BCAFD %0FFFC4CAFD0AFFCACAFFFFCACAFFFFFFC4FD0BFFCBA1FD07FFCAFD0BFFCB %FFFFCB938D8D8D93C3CBFD04FFC3CAFFCBFFFFCAFFFF9ACAFD08FFCAFFA8 %FFCAFFFFFFA8C4FD0AFFA1FFFFFFCAC4FFFFFFCAA8FD0AFFC4FD17FF948D %8D948D8D94FD04FFCAC4FD05FF94C49BCAFD08FFCAFFCBFFCAFFCBFFFFFF %A1FD09FFCAC4FD04FFA1FD04FFCAFD08FFCA9BFFFFFFA8FFCAFFA8FFCAFF %9493A2FFA8FFCBFFA8FFFFFFA18D8D8D698D8D8DA2FFFFFF9BFD05FF8D8D %68BDFD04FFCAFD05FFA8FFCAFFA8FFCAFFFFCAA1FD05FFCAFFCACBA1FFFF %FFA89393CBFFFFA194A1FD06FF94BDC4C4A1C4A1C4A1CAC3CA9B8D8D9AA2 %CAC3C4A1C4C3C4A2BD8D948D948D948DC4FFFFCACAFD04FFC48D8D8D94FD %09FFCAFFCBFFCAFFCBFD04FFC4CAFD05FFCBFFCACAFFFFFFC38C8D9BFFCA %BD6894FD06FFC4A8FFFFFFA8FFCBFFCAFFFFC493949BFD05FFCAFFFFFFA1 %8D8D8D698D8D8DA2FFFFC3CAFD05FF8D8D69C3CAFD09FFA8FFCAFFA8FD05 %FFA8C4FD04FFCAFFCBCAA1FFFFFFA89494FFFFFFA194A1FD06FFCAFD0AFF %CAA1FFA2FFA1FD09FF94FD058D94FFFFCAC4FD07FF9BCAFFFFC4CACBFD07 %FFCAFFCBFFCAFD05FFA1FD07FFC4CAFFFFFFCBCAFFFFFFA2FFCBFD06FFA8 %CAFFFFA8FFFFFFA8FFFFCA9BFFCAC4FFCA9BFFCBFD05FFCA9B948D698D94 %FFFFFF9BFFFFFFCAFD04FFCAFD04FFA8CAA2FD05FFCAFFA8FFCAFFCAFD04 %FFCAA1FFA8FD04FFC4A8FFFFFFA1FFFFFFA2CAFFFFA2FD06FFCAFD08FFCA %A1FFFFFFA2FFFFCAA1FD05FFCAC3FFFFCAC4CAFFFFFFCACAFD08FFCAFD07 %FFCACACBFD0EFFC4CAFD05FFC4FFFFFFCAFFFFFFCACAFFFFCBCAFD05FFA8 %CAFD07FFCAA1FFFFFFCAC4FFFFFFCA9BFFFFFFA8BDCAFD08FFC3CAFD08FF %CACAFD07FFCAC4A2FD0DFFA8C4FD05FFC4CAFFCACAFFFFA8CAFD04FFA2FD %06FFCAFD06FFCAA1FD05FFC4FD04FFCAA1CAC4C3CAFD08FFCAC4FD09FFA8 %FD0AFFCBA2CAFD0CFFA1FD05FFA1FFFFCACAFFFFCAFD05FFCAFD05FFA8CB %FD05FFCAA1FFCAFFFFFFA8CAFFFFA8FFFF9B688DA8FD05FFA8FFFFFF9BFD %0AFFCAA8FD0BFFA8CA9BC3FD04FFCAFFCAFFFFCAA1FFFFFFA8C4FFFFA1FF %A8C4CAFD05FFA1FD05FFCACBFD04FFCAC3FD07FFC4FD05FF9B8D8DCBFD08 %FFCACAFD0AFFCAFD0EFFBD9ACBFD04FFCBFD04FFC4CAFFFFFFA1FFCAFFFF %CACAFD07FFCAFD04FFA8FD04FFCAA1FD07FFA8CAFFFFCBFFCA9B9BCAFFFF %CBFD06FFC3CAFD0AFFCACAFD0CFFCBCAFFA8CAA8FFFFFFCBFFCBFFA8C4FF %FFCACAFFCAFFCAA8FFCBFD05FFCACBFFFFFFCBCAFFFFFFCAA1FD09FFA2FF %FFFFCAC3FD0BFFCAC4FD0BFFCAFD0DFFA2FD05FFC4CAFD06FFA1FFFFCACA %CBCACACAFD08FFCA94CAFFCACAA1FFFFCAA1FD07FFCAFFA8C4FFFFA89BA8 %FFFFFFCAFD07FF9BFD0BFFA8C4A8FD0BFFA1FD07FFA8CAA2FD04FFCBA1FF %9BCAA8CAA2FD05FFCBFFFFFF8D8D69FFFFCACAFFCAA1FD0BFFA1FFCAC3CB %FD0BFFCACAFD0AFFA1948D9494FD09FFCACAFD0AFFCACAFFFFCB948D948D %BDCAFD07FFCACACA948D94CBFFC4A1CAA1FD09FFA8FFA2C3A8BDCAFD0CFF %C3CAFD09FF9B8D69FD048DFD07FFCACAFFFFA8CAFD08FFCACAA2948D8D69 %8D68C3FFFFCACAA2CAA8CBA8FFA89AA8FFC38D8D9AFD09FFCBFFA1948D94 %CAFD0CFFCAC4FD0AFF948D8D8D948D8DA1FD06FFCACAFF9B8D8DC3FD09FF %C38D94FD058DFD04CAFD07FFCAFFFF688D6994FD08FFCAFFCA94688D8DC3 %A1CAA1C4A1C4A1C4A1C4A1C369C3A1C4A1C4A1C4A1CAA1C3698D8D8D698D %699BFFFFCBFFFFCAA2FFA893698D69CAA8CAA2CAA2CAA2CA948D698D8D8D %698DA2FD09FFA8CACAFF948D8D9AFD0BFF9A8D8D94A1FFFFFFCAFFCBFFCA %FFCBFFCAC4CAFFCAFFCAFFCAFFCBFFCA948D948D948D8D9BFD05FFC4FFFF %FF948D8DB6FFFFCBFFFFFFCBFFFFC38D948D948D948DFD0BFFC4FFFFA89B %93CAFD0AFFCACB94949BCAA1CAFD14FFCAC4FD048D698D8DCAFD04FFA1FF %FFFFA8CA9A9BA8FD09FF9B8D698D8D8D689BFD0AFFA8CAFD04FFCBA1FD0D %FFA1CBCAFFCACACAFD11FFA1C4CAFF93FD048DC4FD04FFCACAFFFFCACAFD %0AFFCAC4A2FFA1FD058DA1FD0AFFCACAFD04FFA8CAA1FD07FFCBFFCBFFA8 %C4FFCACAFFFFCAA1CAA8FD0BFFA8C49BCAFFFFFFC49A9A9ACAFD04FFA8C4 %FFFFA8CAFD09FFCAA1CACAFFFFFFA89B94C3CA9BA1FD07FFA8FFA2FD05FF %CAFFC4CAFD0BFFA2FFFFCAFD04FFCACACAFD09FFA1C4CAFD05FFA1FFCAFD %06FFCACAFFCACAFFFFFFCACAFFFFFFCACAC4FD0CFFC394BDFD07FFCACBFD %04FFA2FFCAC3FD04FFA8FFCBFFFFFFCAC4FFFFA8CAFD05FFCBA1CAA8FFCA %FFA8C4A1CAFD06FFA1CAFFCACAFFCAFFFFCAA2FFCACACAFFCA94698D94CA %A1CAFD06FFA8FFCACBA8CACACA9B8D68CAFD06FFA2FD05FFCACAFFC4CAFD %04FFCAFD05FFC4FFFFFFC4FD07FFCACA9BBD9BC3CAFD07FFCAC4FFFFA8FD %05FFC4FFCACAFFFFFFC3FD048D9AFFCACBFD09CAFFCACAA1CA9ABDFD07FF %CAFD05FFA2FFFFFF9BFD09FFA8CAFD04FFA1FD07FFA894689AFD06FFCAFF %FFC4A2FFFFCAA8FFFFFFA1FFCACAFD04FF9A8D8D8D689ACACBA8FFCAFFA8 %FD05FFA8CAA8FFFFCAA2CAFFFFA8FFFFFFA2FD06FFCAFFFFCB9AFD09FFC4 %FD04FFCACAFD05FFA1C3A1C3CAFD09FFA1FFFFFFCAFFFFFFCACBFFCAFD04 %FFCABDFD048DA1FD0AFFCBC4CBFD04FFCAFFCACAFD04FFCACBFD05FFCACA %FFFFCA8DA1FD07FFA8CAFFFFCAFFFFC4CAFFCAC39BCAFD06FFCAFD05FFA1 %CAFFFFFFCACAFFFFCAA8CAFFFFFFCBA1CACBBD8D8D9AFD09FFA2CAA8FD06 %FFCACAFFA1CAFD04FFA2FD06FFCAFFFFCAC4C3FD08FFA1FD06FFBD9BC3CA %FD0DFFCAC4FD04FFCAFFFFCACACAFFFFCACAA2FFFFFFA8FD09FFCACAA2FD %09FFCAFFFFFFC3CBFFFFCACAFD05FFA8CAFFCA9BFFA2C4FD06FFCAC4FD04 %FFA8C48D9BFD08FFA8FD06FFC4A2FFCAFFFFCACBCBA1CAFFCAA1CACAFFFF %FFA8CAFD07FFCAA1CACAFD05FFCAFD04FFCACBFFCAFFA1FFFFCBA8FD06FF %CAFFA1FFFFFF9BFD07FFCAFFFFFFA1C4CAFD11FFA1FD05FFCAFFA1CACACA %A2FD06FFCAFD06FFCACACAFD0DFFCAFD05FFA1FFCAFD06FFCAC39ACAFFFF %FFCB9BFD05FF9B9AA8CAA1CAFD12FFA1CAFD05FFCBA19BA1CACBFFCBFD04 %FFCACAFFA1CACBCAA1CBFD06FFCAFFFFFFCAFFFFFFCACAFD06FF949494FD %05FFBD688DCAFD04FFC4A1FFFFFFA18D8D94CAFD0BFFCAFD07FFCAC4FD06 %FF94BCCAFD09FFA2FFC48D8DC3CBFD0BFFCAFD05FFA2FD05FFCA8D8D8D9B %FD04FF9A8D68C4FD05FFA1A8FFFFC4688D94FD0BFFCBCBA8FFFFFFA8FFFF %C4A2FD05FFCB94A1FD09FFA8CAFFCA688D9BFD0BFFA8FFCAFFFFFFCACAFD %05FFCA698D68BDFD05FFA1C39BCAFD04FFCAC4FFFFFFC49AC4CAFD13FFA1 %FD07FFCAFD0AFFCAFFFFCABDA1CACAFD11FFCAFD06FFBD8DBDFD08FFCAA1 %C3A8FFFFFF9BCAFD05FFC3A8FD07FFCAFD09FFA1CAFD07FFCACAFD08FFCA %CAFFCACACAFFFFCAA1FD0FFFCACAFD05FFCAA8FD0AFFCACAFFC3A2FFFFFF %9BFFFFFFCAFFFFC4CAFD0FFFCAC4FD08FFCAFD08FFCA8DFFFFCACAFFCAFF %FFFFC3FD0FFFCAFD05FFA1FD0CFFA1CAFFC49BFFFFCAA1FFCACAFFFFFFC3 %A8FFFFFFA8FD07FFCAFFFFC3A2FD08FFCACAFD07FF9A9BFFCAA2FFA8CBFD %04FFA1CAFD08FFCAFFCBFFA8FD05FFA1CAFD0DFFC4FFFFCBA1CAFFC4CBFF %CAFD04FFC4CAFD0DFFA1FD09FFCAFD07FFC4CAFFFFC4FFFFFFCAFD05FFA2 %CBFD0BFFCBCBFFFFFFCACAFD0FFFA1FFFFFF9BC4A8C4FFCAFD05FFC4CAFD %0BFFA1CAFD09FFCACAFD04FFCAA8CBCAFFA1FFFFFFA8FD07FFA2C4FD0AFF %A2FD04FFCACBFD0FFFCACAFFFFFFC4C49BCACBFD06FFC4CAFD09FFCAC4FD %0AFFA8FD04FFCACAFFA2FFCACAFD04FFCAFD07FFCACAFD09FFCACAFFFFCA %CAFD11FFCACAFFCAFFCAA193BDFFFFCAFFFFFFCAC4A8FD05FFCAFFFFC4A2 %FFFFFFA8FFFFFFCAFFFFCAA8FFCAC4A8FFA8CAA8C4FD04FFA8CAFD04FFCA %FFFFFFA8C4A8FFFFFFCAFFCAFFA8FFFFFFA1FD13FFCAFD05FF948CC4FD07 %FFC4CAFD07FFA1FD0BFFC4FFCACAFFFFFFCAFFCACBFD05FFCAFD0AFFCACA %FFCBFD04FFCAFFFFC4FD14FFCACAFD04FF9B949BCAA2FD06FFC3A8FD05FF %A1CAFD0AFFA18D93CAFFFFFFCACACAA2FFFFFFCAFFCACBFD0BFFCAA1FD05 %FFA8FFA8CAFD15FFC4CBFD04FFA1C4CAFFA8CACAFD04FFC4CAFF9BBD9BC4 %FD0BFF948D8DA8FFFFFFA2FFC4FD06FFCBCAFD0CFFCBA1FFFFFFCACBFFCA %FD17FFA1FFFFFFA8CAFFC3CAFFA8CBA2CAA8FFFFA1698D688D69CAFD04FF %CBFFCAFFFFFFA18D94FFFFFFA8CAA1FD05FFCAFFA2CACAFD05FFA8FD07FF %A1CBFFFFA8CAA8FD18FFA2FFFFFFA2FFCAC3FD06FFCACA938D8D948D8D94 %FD0BFFCAFD04FFCACACBFD06FFCBCBCAFFCBFD0DFFC4CBCAC4CAFD18FFCA %C4A2FFCAC4FFFFA2C3FD06FFA18D698D8D8D698DA2FD05FFCBFD04FFCACA %FFFFCBA2CAFD04FFCBFFCAFFA1C4CACAA8FFCAFFCAFFCAFFA8FFCAFFCAFF %A18D69CAFD19FFCBC4CAFFC4FFFFFFA1CAFD05FFC48D8D8D948D8D8DCAFD %0AFFA8FFFFFFA2CACBFD05FFCBFFCA9A94FD04CACBFD07CACBCACACAC48D %8D9BFD18FFA8FFCAC4A8CAFD04FF9BCAFD04FFA28D8D8D698D8D8DA1FD07 %FFCAFFFFCAA8FFA8C3A8FD06FFCAA1CAA8CAA1CAFD06FFCAFD07FFA19B94 %CBFD1BFFCACACAFD05FF9BFD05FF948D8D948D8D9ACAC4FD09FFCAFFFFCA %A1FD05FFCACACAFD05FFC3CBFD0BFFCBA1FD20FF9ABDFD05FFCA9BFD05FF %9A8D69939AFFFFCBA1CACAFFFFFFCAFFFFCACBCB9BFD04FFCAA1CAFFFFCA %FFCAFFCAFFA2CAFFFFCBFD06FFCAA1FD21FFCA94CAFD05FFCAA1FD05FFCA %C4CAFD05FFCACAA2FD05FFCAFF9BCAFFFFCACACAFD0BFFCACACAFD06FFCA %A2FD24FFA8C4A8FFA8FFFFC3A1FD05FFA8FD08FFCAA1CACAFFA19B94C3FF %CAA1CACAFD07FFCAFD05FFCAC3A8CAA1CAA8C4A8FD27FFCAA1FD04FFC4CA %FD04FFCBFD0AFFCACA9B8D8D8D94CBCAFD12FFC38D8D8DC3FD2AFFCAA1CA %CAFFCAC3CAFFFFFFA8FD0CFF94698D8D8DA1FFA8CAA8CAA8CAA8CAA8CAA2 %CAA8CAA8CAA8CA948D8D8D93FD2CFFA1C4CBFFCAC3FFFFFFCBFD0CFF94FD %048DC4FD04FFCAFFFFFFCAFFFFFFCAFFFFFFCAFFFF948D948D94FD29FFCA %FFCAFFA8CAA2FFA2C4FFFFA2FD09FFA2C4A8CA8D8D689BA8CAA8FD0FFFA8 %CAA193688DA1FD2FFFCBA1FFC4CAFD08FFCACAC4FD05FF9BCAFD04FFC4CA %CAFD0AFFCBA2CBFFFFCACACAFD32FFA1CA9BCA9BFFFFFFA8CAA2CACAFD06 %FFCAFD06FFCACAA1CBFD06FFA2CAA8FD3AFFCAC48D8D8DFD04CAFD09FFCA %FD09FFFD04CAA2CAC3CAFD3DFF9B8D8D8D94CBCAFFA8FD08FFCAFD08FFCA %FFA8C48D8DA1FD3FFFCA8D8D8DFD04CACBCACACACBCAFFFFFF9ACAFFFFCA %CACACBCACACAFFFFC49BFFCBFD3FFFC49AC4FD06FFCAFFA8CAA2CA9A8D8D %CAA2CBCAFFCAFD07FFCAFD50FF94CAFDFCFFFDFCFFFD87FFCACAA2CACAFD %13FFCAFD47FFBD8D8D8DBDFD07FFCAA1C4CAFD07FFA1C3FD37FF9B8D8D8D %69948D8D69949ACAFD04FF948D688D94FD05FFA19494C39B9A94C3FD05FF %C49BFD37FFC38D8D8D948D8D8D8E8D8D8DC4FFFFFFCA9ABD9ACAFD04FFA1 %9ACAFD05FF94BDFD04FFA1C3FD1DFFC49BFD18FF9B8D8D8D698D8D8D698D %8D8D68CAFD0AFFA194FD08FF94C4FFFFFFC49BFD1DFF9B9BFD18FFC38D94 %8D9BFD04CA93FD048DFD0AFF94CAFD08FFCA9AFFFFFFC3C3FD1DFFC49BFD %18FF9B8D698D9AFD04FFCA698D8D8DA2FFA19B9BC3A1FFFFCA94FD09FFA8 %9ACAFFFFC49BFFFFFFA2CAFD07FFC4A8FD04FFC4949A949BA1FFFFFFA1A1 %94949B9BA1FD04FFCA9A9A949BA2FD04FFCAA2FFA19A94C4C38D948DBDFD %05FFBC8D948DCAFFBD8C8D8CBDFFFFA1C3FD0AFFCAFFFFFFC3C3FFFFFFC3 %A1FD07FF94FD04FFBD9ACACAFFC4949BFFFFCAA1BD94CAA1CBFFFFFFC494 %CACAFFC394A1FFFFFFA1C3A1BDCAFFFF9B8D698D9AFD05FFFD048DA1FF9A %8D698D9AFFFFC3A1FD0EFFC49BFFFFFF9BC4FD07FF9BA8FFFFC494FD06FF %94A1FFFFFF9BC3FD05FFC494FD05FFCA94A2FFFFCA8DBDFD04FFC38D8D8D %C3FD04FFA1FD048DFFFFBD8D8D8DBDFFFF9BCAFD0EFFA1C3FFFFFFC3C3FD %07FF9AFFFFFF9BC4FD06FFC3C3FFFFFFC39BFD05FF94FD07FFC4BDFFFFC4 %93CAFD04FF9BFD048D9A949A938D8D8D689BFFFF9A8D8D8D9AFFFFA1A1FD %0EFFC49BFFFFFF9BC4FD07FF9BCAFFFFC394FD07FFCBFFFFFF9B9BFD04FF %A19BFD08FF94FFFFC494FD05FFC48D948D94FD078DB6FFFFFFC38D948DC3 %FFFF9BCAFD0EFFA1C3FFFFFFC3C3FD07FF9AFD04FFBC9AFD0AFFC39BFD04 %FFC494CAA1CAC4CAA1CAC39AFFFFC3C3FD05FF9B8D8D8D698D698D688D8D %9BCAFFFFFF9A8D8D8D9AFFFF9BA1FD0EFFC49BFFFFFF9BC4FD07FF9BCAFD %04FFC3949B9BC4FD06FF9B9BFD04FF9B949A9B9ABD9A9B9ABD9BFFFFC49B %FD05FFC38D948D94A1C39BC3A1FD06FFBD8D948DBDFFFF9BC4FD0EFFC3C3 %FFFFFFC3A1FD07FF9AFD07FFCACA9B94A8FD04FFC49BFD04FFC3A1FD0BFF %A1C3FD05FF9B8D698D9AFD0BFF9A8D698D9AFFFFC49AFD09FFA89BCAFFFF %C49BFFFFFF9BC3FD07FF9BA8FD09FFA294A8FFFFFF9BBDFD04FF9BC3FD0B %FFC49BFD05FFC38D948DBDFD0BFFBD8D948DBDFFFFFF9AFD0AFF9AFFFFFF %C3C3FFFFFFC49BFD07FF94FD0BFFA1C3FFFFFFC49BFD04FFCA9AFD0BFFA1 %C3FD05FF9B8D698D9AFD0BFF9A8D698D9AFFFFFF9B9BFD08FF9BC3FFFFFF %C49BFFFFFFA29AFD06FFA88DCAFFFF9BCAFD06FFC49AFFFFFF9BC3FD05FF %94A8FD0AFFC49BFD05FFC38D8D8DBDFD0BFFBD8D8D8DBDFD04FF94C3FD06 %FFC494CAFFFFFFA1C3FD04FF94CAFD05FFBC94FFFFFF9BC3FD06FF94C4FF %FFFFCA94FD05FFCA94CAFD05FFC4CAFFFFC3C3FD05FF9B8D698D94FD0BFF %948D698D94FD05FF949AA1CAA2C49494A8FD04FFC39AFD04FFCA93A1A2CA %9B94A19BCAFFFFFF949AA1CAA8C393BDFD05FF949BCAA8FFFFFFA1949BCA %A8C4949AA8FFFFC49BFD06FFA1C4A1CBFD0BFFCBA1C4A1CBFD06FFA1C39B %BD9BCAFD06FFCACBFD06FF9BC39BC3CAFFCAFD05FFA1C39BBD9BCAFD06FF %CAC39AC4FD04FFCAC39BBD9BCAFD04FFCACBFDFCFFFD0BFFA8FD2EFF7DFF %A8A8A8FFA8FFA8FD06FFA87DFD12FFA8A8FFFFFFA8FFFFFFA8FFA8FFFFA8 %A8A8FFFFA8FFA8FFA8FD24FFA87DA8FD057DA8A87DA87D7D52FFA8FF7DA8 %7D7D7DA87D7D527DA8A87DA87D7D7DA87DA87DA87DA8FD067DFFFFA8A87D %A8FD057DA87DA8A8FD22FFA87DA8A87DA8A8FF7D7DA8A87DA8FFA8A8A87D %A87DA8A8A87DA87DFFA8A87DA87DA8A8A87D7D7DA8FFA87DA8A8A87DFFFF %A87D7DA8FFA8A87DA8A8A87DFD22FFA8FFA8FFA8A8A8FFFD04A852FFA8FF %A8A8FFFFA8FFA8FFA8FFA8FFFFFFA8FFA8FFFFFFA8A8A8FFA8FFFFA8A8FF %A8A8A8FFA8A8A8FFFFFFA87DA8FF7DA8FD11FFFF %%EndData endstream endobj 200 0 obj <>stream +%AI12_CompressedDataxɕ&w~ 5!w[|4[TkPR JՆF#A1C)v1jff~Fi*hHfܖ|g_wwMo^;Żw?#.7? MO717~xsOdv޽'?˿}o۟;Ot0lvy|o;&Α>=|t1WyZviYv@os< oR">Lԟ>so~݇?|w_~zw}7Do߾o'zf`!|}o~wk[׿|u^YaEn?-Mv߽on~vnhJ]Q~xݴ3w4<7oU\z/}w˜h"}8dҏQ(3yǷwݯ>dJ}/o~㻻'/_~߾{m( }ۻOloâo?U3q'ZͰwwCL֡-+tdohM~iNKo)=,W'å/նo~0?~yO[݇ow3{״R=~ſWÏ?t?Owob~/uʻ~|:=tֿ}/IOwCX{[7~_u~f]=S$#|P/zD-l.7؃w?o?|xݶ2_5?]IoX_[o_%~$!_o^{s6֟݇woʯ_ͻDw^D{_z?a~72A??nί5zu'y}|[b($ݾDӮ;|i'!.9On4 H?d_¯'o>|ٓmɝ='`˙x0 / x:4)iT!gic9Zt=Cڧ%iJc)BRxq_N6MwԖ?[m9U[Qi牔|K K\Ғqe9,{Kaɽ=@CO0r8[[nڰKT˿< FmjCηMfN~4#vLs0s?Ngô'7OD<)Na~4o0ecov6ΰfc6;+pU+{lbs՞*=u|@=m#QRCxtt`ȑHryczK6MP0iz4QzH8|.4G۹񢝸vηx%%Bt&=&z|$孧՛ޖަ: 4:Fb!:cO:9ALG7= ?ѱ:~ÞЇێhaUC&:@CROaQ0 0q["C!r SvcL1Ǒ6 ˢDDۤ͸sKҨEgSZ}wg|34hg2㩎423OLӽ)Ǥ1-U-w$up&':-#b6ğA۾99-ĚT>K'e,;fg쬛vS˺1e²  +8yyZ7cB{n汏i~ 2%oe|wwKNEZdk n`P q -@_AĘEDy`AܞU (P'&V)T@H +q@  +?.Ԙӳ==sLZ^8il-{!0vݓ z!P`l&=3@;0sd`OC*H/"Kg* Q@"H~8BhHZ, ,񙬟dVc"( +WEdCE;V=+FfYcW>gIQ9v]BuGoۖ^NwB*03p`L +@0Cfaf`Ya B@e-4^Q3llFFN )Ȃ.9<̇y⣽p'͑ Y;821n;g,f%rv$pf50lF{FcY@skUYeVhtdu'3 +#ҡN=+o! 3`U{IuJ~Q Ȳx  n’,W2D[8?zjG)gHT3B igSVyj@.Rzf$Aaf?lVjsv#%>XuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ +婜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1 &g0 !Mx>QlM\:|.6qCR*|rD&ڳV|Vj]6)5"1'ך ;&1%2I="ԒY-b'$@X>,Љ[D* +$f6`7#c33307'f?gsءW.'+eL#s9\jaNe0!vd0t(}T>(i:y~Ֆu!/d߻(>UW + ᠝Nttb+Yz[i]4v&H#'G]OGw17XCZ 2@۩Q71nk5V~`ٮ٪ޮTuBO0XP®Il.k6i.#=\w} M)^U;3k-\/sHqش1+hKmX+oZ"GJ lЖ[*b]kn9Y`xh ljޣee"I*wly4)rtXF)]$# 4:"(>#Qo|-+]8u1{s[#1>Tټ{5j>>Xt_T޳gH6JC&OEЪ#|&S٭ӈgv?&ѯ11j~ݎc/f pa+,TSe +/gmKp;6ۢطɭ܊&B[L`3_ +FH6SRA%-sYN7#VrߍBI+|6Eϱ?kѧ|өKwjAgn܋F*vj&sUc-X1jZ4Uhad+rWb/cq;1Rq㼑w,6@w57swĎ3O)vq#/w5ϖ:,Bhh^Uxƞ +wf Ř:8}e1 r^m6P`bG~ 96>AD'_>j?uC /zJV7BL*)URyO|i`nb'P/uT!C* qwW/?ȼj?R( +_p>oۦ[x-y{8]џnmvT5p_܋[9=vX$bY&9h[o!rnYkء Kٗ^!v2;e]&2$)I:#FSЎAyT;X>j LDks+gκ$y("hjNZA2(GNeHd9QDJdS s64l8 [aiھ%VB60qc՚Nm+|ٺOi^a~N=U-\&w\ܳ;5:kSyφ5ٺ.*V#Pý~-ĠyuѭvrloHt=ӣ4mgnuO{?EO. L:!Dr$UmIx9'\gT233\kFX4Cb}CQWTtpռVyRJVk wI74\cQ + UxE  +lTFX KSO5j+IJ~'&n y8x?mG6"]unOUo/lQvd:q`V&(fQA>c\-zEZ܎C입Nz+[Y ӱ3h{tj@SM;ST˭j'3itѦDY=;sA9Z+I4Њ6"Zrŕi޾]mn[YmlŧOY)4oAk`0'NpxY=-֢D'"B&Z*]64ʃkYйP +0jIB?JԺ^/}fe}-ERSr<%WXbyG4Nc^nz=PgSQ7R$u#:`O*޺_e~WFģ{Z%{mv[ۣe>]+Liq.CFav +ѶֵƴJ҂kq:#s+5RDZ8"78{OtejK"tOR)RzW]:K^}j'C˺D1~t^vWB4Y.iuJ2l V.s)lV&ugۘUfZ>,f#6^ u)LvDyٮWn[_/ߺ/yhE]cyQmVtYdNJ V4|mY5#g 4șFpnph}E3D2-0o Qf۳cؗļ.cTf@dwS_#'Ta`rWA f +\cOJJy6r4OIPB[P]Cd3-Y7}٪QeRAN +HM*iu>z")QY32VuƋŒrdxwO;~JyRTԵνVl>#ӄsĥ-fk,6.mbƛvRiHd7.xfYVH { V6dTX!=GwO5Rc8=}_x& ~]XV$I֓$)`+,]&Iؤ'7[O3NlI#3$-lWLV[\z`ف/y;vja*!3N*+8-:mbeGfr!oGإTd RlA>4HVB y Ғ ?sRNm3N$D!9ZgV&cu{kYruᒽʦ!*g_Gv.Ge`VJ^(^寵կs42% +=Y) GY B+dku?SwxWyF`MLҕA)yJ5XОԟb4r,@s۾aEK/w?S:?`":ΘR=WFط/fIcǟ,vC[B4U 0ϒ}֌fkP _6Xf+d2Y67.p̳k[ +'9K[*$=dUsp>%4?U&Yڗ|sg: +>yƩv;}ΞMn-&Wc64LJ5Ri:uX*qTQ+qhYҸݱ|7ިܫyvZwp%D_OsO.==IϝZn^V^sj{P=i4㺿|t}v#!&>K|+N_g|}?P%7ڵWڡk(m@[Zqr҃6n/]0iї:y*8On)q+CKsT_ +6\Jշ[w" +JuMŷ*qU|C2,.U㢰GwYcdvQR 1mZ:u_J;3iGHDflt.OwPRF~7F'E }b9,2^۶i+Īy誘QmtUnG+ywW\^ԥkN3)yU*zYuYNWmqkúBӭ*4ụdz3y*=j\SG{WƗK_ +n={Ytz~]cVסk)+YxVIM~QkKb[eu?ъeMuqc6?xMq~ + +ulcjrLb~Pl&tm'XǒQ0mGiNJ_d5%nY34L` faX&";{F:6F_:,'>-jz%ذSA~~+H$ KZsD=fW7_h|dFyp:Nh=.]ikZ{vϲURkh z5GGfLgW) 'PXOA~HaA*"a#_ZWJGhOuU __|߾zUw/_}Dͯ_t=}޽}|nHM&i7 ]^ͰLqd̃A/?N߿~<Qs]x6;ؼ<7~xv?gδҙ$S@DL$#+( #sBC mZtKH dۅ&/EhuHZni>I嗑>m2HKc,FpY_31o O )sH +)bOH'1fP`øp8>qӠ o38H7$ Q  m?PH%r)P0dU8~E2oTa fNqikZREZ݅0DbtqZh/ɨ܎NcHƑb I0JEpv} S̑ s/3 R5FhCoPqO/sq&.IEK4Ҭ!'Ɂ4i<$0X,"p,82wNҜML߈ +P/wxdvQޞ-ხk׽d'[6 z$*CPAW6'ʬ@y N̑BS'7CZ{t|^~Mh P|mȈ@@lːߥ{*ӒxY26 '+ мLJ'w; +>=vXH"R/͑!`jAϠv4qrRL:roDwP2;BHE&5C2zٕQ:<6t)fbJNɝA$:;5DwmF)31Tp#.Cjln ˨$LMY@&b )#2n3y46L 83Ε#+ڰIKayN36!Ā~# 5Ɣ#,`nƶq@Xy;AU|dfv'4,x4.:=|2mF>".NrX(&B&ee +0(Mbt4LfaS~{>k"p|I*9x `vFqWCWw4BmVD_`pH &瀽Lsk @|#'>>Pp SA DV 34c `F Ʒqe`Ù΀KL gT#<6,tLyGb]yY\Uç Dɔ>1fp]DF'+b 6c@S/3@H=1"mIR{ Y (lz{yaGnhZNFgh8N jg{Y=9%~)Ģ)S@Q)-9F) 0}7fM38XtlG?pBĮLzNZ-2(T/φ.D7fM_oڝ3kվ%⪚ ْBm8@ mx@@.}3Dr;fRYlݸ@#;?^br}r·șC<Hy Dy XZZBBטuv +bTlph)0[3Sh2I1v}Qnl N˲<` &aC˼ĝQ U<ƙxƼ05V䏪`+؃}1a#| b1mXQUrII,m.ܰer@ǸJtU ;\ 0(n3@,&\Ǖ~29tRh7]ˍ+!l];:هF2$a0Q?Q4;d +u˔T$XX uM +C{SL +=<豦 @asՍrq6 N5<78|A0]f36Mh,|jTu`aFc+lB%uaH"B+.J58TFJDW=\GĹ?LS5`8B㎳W%{#4~EIg!g> +>b}+;UA/eЬa y| +j"||yqjс܆]pku PoBGԚoj|+G9GH:G z >Yc(@CkS@SN:st:E4h iuHIJZnH#N 6@c wqP9{ΝcL19RL|g7 MΘz̻\|j€Y+\^pF#Wl]DJ| 0e\8RpA(/A! $,ơeH~~L&AjePJFe4#3|O*(/a]e t g DoAha` #Zn"Ac)%>"Zx/bC|۩atfy]{5*^K7l5F1T}e*4}v!iOrx LGl쥯7y !$8ciԎ e}D(a_pM0qK/)(]u)P7V AB(΢,W_9:~~!.=;7 ?~9g"=,d])^j@lŪ%0Y ."R4,1a/>Qa^Vj%LIw8HMn$ DYYɓ6G@ŕ3hD΢.jˋ`}$^G#!2Mȋap̴A4KpnC3#viTvcY{1Z\#U#JCh7Σ?>2-apQU_<6_أW<Ȯ>y[#X~$^ upy D}:.n"݉]o]c}w4!W !/jwaAr`?:,3jS)L\i-Tϲl@= f`cKV܇Vc1Ρğ%ZBYw LM»䔕_Rn_Ѽ ێbmCmT=HجBb+SN:a.vCEk +1uI/T& +c$@*ycDFčJ_A|dzs/Qf#s#b%-Eęfr8Bz=6@'xMI 6IWm,}!]B6j vgQRlK`J+'(`G]-ԐӘ|+Q2G O…gL9q"N=D7-.[c'`Od =2,q*dpL9FpE=~p>i6AKp&zl~1t1~p*ݞam%yF+$Y웯wS aFtƺ)Lfh 2^'Fps@I\y&/ nko8Tp̉3I9͚gC@vXX\~ `# 4,}āK̹OYԽ& 5 +>Ig+Euv!dKm8.BSDɚm}w5lzeZ FWAXmDCL[t2|Vya_մꁆ + ϹȂlSl-Vf۰vk󝾫}>| 綜$[:OjW$D}7 K Z\ 6XXeyB%(PUBkO@N~.& KDt()v*9<@HYu-@@:u#9l<3u6{fZi+M@MO -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!SLB M3,*DW+Z?x@T eI0h +=8}d)fML5!S,]yZ'eP*3$XR ޭy?iIO/Icy 4S"<"/dEI5.a<<8&52V;<5OSY<}aS.yc?^@=4(2sdnK,w6`|͑0d`"yO2ؑ<)D v7d(iꙵ~CƎ \.#̫s Z=4jg@ZHpƫp8!1oIs <Kχ e X"gCQIxUd`4:Ң4V2.Y'%ў~ńG׵F-c Dt L,F<ԭ:t<]e4x֖YfHւFp|BHY]A1-7\ȪbI`=h0 `ap j3$q+#m1p& ). .-<26I_XcBčOPouf <Zep9lA3!c UTk u<|(R9X 0:gբὌ e:߮Y" + IC5 WNÊ8<5),uJ'XjALvaJ_3 ,H" 9:SDZ iXZ +HB +@D"wr`@@(Pqi ewq:%fvRp쥖NEBKX` 4d#B)I82n`_uj74 <) Y-J81leU*w@ӱ :i bdvX/8jaX^$g)d\8$3CEU*a-_DBYBP~F]kF$OSLy]3d6Tβ|n8jlWX|^"x[84DOq$%~Kl nD\A<n,ľq.j~ EfPPz4>L 4gDžaERkCcN!)=d6%֢vU˛E): `J<6TsETrB3L _2, ᦗ4HG䢴q҈-ۜe 9 Lp* /P@d>|H tY"[u~ZS~(" + AP {H_R W8LU\̹s"x5<%Wfſka.HBЁP!ph .~Y[ .//UeZ g +Kg.~T,g |I5F"%hH%q*BdͿ]M~0 . +={Y5PI.~=k(IsZ Ͻ,{ʜIy'ZLNc6GAL &!fzȔ؈?4ɤƃXrhU VIr얒R/9)Oi$0fZ}/y i֡>B"Kz$>Uvѓ 7bIQM$mfOcf k uVq4K%G&'`>oł%qmpyOcoX,G\go*9p-ͧɀWy]&O|%-,xCuA]mnAE=ኺFIC,H=0M *Cz0M9%S}oS( R#"%эR6ύ#Y5zeQFӚW{!ktch cmzH`5:1`'&\BMcx\&~ٹ9;CPhg{u3Gvfm}ʰ=ڻREWW5ză +M Ǵ+u{j1&x IMRҖHyLL.5m\F.I6m\4*zYd&zzKJ *? 1b To<^٘"ToJ2'LYQI,\Tx6 W_xv Ӄ<)KMU<)\ղ&-+o>;K0:`4EOW⺤4qI}⊩H)%QqIzgdqUْBdvq3uݲĔ+u6r@@eTS`Ba˯4>6C8 Y}!tRf`vf0([$6ܔI0`LVI5'p$_le4DAVxKx$68M#q0-l@S>M@hZ|`W49ߗ@h(SU6MlQu24χo 7.eOl4_`Ʀ\3E4&]ǯTeU<Y^4: $it襫y[0*ԴC͚=H|fJ>6ib& Ͳn<;MC>hd/{W(*_3~-5_l%tJ(4LuE/T^S +˾Y} XmcP;Ee֋kOC*wd>Mv`}ɒ@P&29UjHDj2&Dx'wVͱRbXӴt-Ӻ] 2=C Bo3઀ٖpuۦPkW%YoP5Hadž (aOq՟-2ͧ5 6e \-j*&LXM_L8R5 . =S. ^;#u"20KXRoIMGJM KbeiTʤV8,-KY K Ygx40eKXu2,BKM㛵_[o]hGm:?> ~}4'މ/ќf4J;hvC]sEVl?ow <^׼dKLM[I4J2'@"ЙT9m4f;a`a(8ƌmDUf;K8tI3ӕR*nRQ-NG^!mѾлJXzeTm$@"? שy೔JHe0ϫ)2۰L= hch+mI,Aya + R&[Zu216uʇ2( Y( ^MQӾSw7j󙶥}6|hfO@9gJh#DɑGtW0a]q.~QtW^j(`A bF8* +#]gb|W9U9=U'-NFؽG(f wU|W䬁 +y%,t仂ݝz+?R32^m&h=\ebjeDDLWEQ +鮸``??^)Dkija{П3f6/}H&yg_pؿyw5n=%2I,p'n&V42YF8Tnv1XzQ$JAV-N`ЊI3rOHgRK76E5\* J"Ni$OϜJ"C{N/݋\z].Ƀ8psILL l&,,|QMl\JmuY.o܋!1&4103 +& Z*d}Q+ +2X&~UX9#-tp,CCН|:rL#Gf\H0M5B9h\E_1U=8ykz$ DR"&(_ l- .XN w@REhl&Ki"kz >H ެ&LDX +p!2PebLh"MŵϬV DOV&ҚsW~X/QԴJ laRk WӪ'a.5{"j=.PjD@j/EzbBG5:PzChe¢5SVW[}㓭R'~K 3OTNk"*4Ep gSD'P*yRBjs9Wf"&nyTf?`wzI+ "OVJ_Ee4ṼY/~2ᵸbP2WxZWup@ATGȓ~z?cϣ& c\|zx. -"Esu!S+0WYWVcV1N[dE P[dA)bn ^ᤍQ6J:BV>.7j90L°OW( +Z'%k#m"Rp5++<=+{^DIs9/pN\]V 젂:KV WfKT*a~VUn#x6 )aD<2y^r[]D1]"QZ(\3R#sxyH#9$4P$x;xEJz~r%辯WsV3,iZ&T)55aӪ57'^Sazq@߹RFY{vMT(k}Z-$%RQt!ʜ2~ՆQ5wPv^V9+;UWk{Uw6a^GRo֦Ԥڵ2z[_n[[һeZfz)_^׷~) \/ֳ效#Y*-Ex5F-Je(rMyJUfPrQ1P;TыE;,Ekŧ{yj'^ƺ!^ډWvᕳjm7^ ZvſVEez!qg^pa^ܸ.wF^ \5륻u믻,b%7.TR_4+»A+̗ + e^޼ y^ޥ<ӵZlR^.y*JH%vAɺFQ62qF2[޶&;\NUY֡O[Tπ"$ZScIG!l^ ~vqɎZ ?P6P2t$\MR9M:T`!100ML@fL<j$ӘlZc_L|R:Ng ""eQF ɕ +Cʂ0$c\17Lʌ b1qIf&D.f.pwb$֘xЙy*ޯQBAOǬ t rJ~Sg7ltM4J@~ἴ"gtwi,a JWJ_+*Tfw+9k> \!z"\ŧ,e- =nӣXz 75 3Rqǜ:JD42Fuj +PpD# ݪ*(0g<'ףıgьy}  ]EzIp+dfoF֦f^aHu%š?, +se am EvD%ά*,VuD=c$k"\DNc)?->K_[лMc/rPqi`\ YG3(0a+-ؾ!?l\paP9/2 q_DZ\+NViVX>E`+JkqHӖO;Po6A uq~MD_Bb常 +=gOY:WX|_.hcYh/` }6$}x4C+nDZrjm*ɶ*B)l 5*TQU8e{ ;۠&1V| RtI__1` = IKPăE & k9.o>Hn∀gRIKX@ &4/8$2 +* +sM$)EԱ1&1س$哸+HKsb* K@ܗ>$+#p-h$6aZ9K`vՆ :|p&9' Irg~S#{ b'mV8_rv#!oI(fٝ.JeY\~ LN>JI +bPt-+c[sދZ(bbCG9(Vӳ6dZ MΰdSN`9d.kſLy`E+qE+[86^>$Y0XeWkEE +iA^jPPIa9@ +"-xL˾m}u4H4u.3FУ%{ ڶ0_3F}?B#AbT7iQwP24. g=>pp&I+Q}ʦ ;ejaL-8XYqlV`&~mғml#ۆm7φ}rF-gV:oJ0?G8H+H 6FF(l]p*|adi|x oDVTgc9cHpe]8:b +'oGN<08'_P IěU>s'cy\4$ 8I*V'P/#! ) ۅK'1 e'?ޭ:s0rwU)wb+AbA@0cy(]Cɭȉ熜}j:jݚ(:r|f +⠜H ^ V{eGּ{g^?~P,l83iu.EQ۾Qb9j@"b!>aqQ5цa 9N͆Űs3ذt9;l00 5ap[vTH,sv+abQQ-Qд>꼟D]$Z.V~i6f1b!X%,Rgcv2gcXKeFS1j)-ȩ r0M:U43b*F$DOhe +kz'_6b[3Hlr.FpX1Y 4#Cz\\4CHǦ^$?\R9M7>j:Ũ6\\4\~%[Ҿ.9V/ӳOeYvTzt(l3t6k&^>}~2$l|2n9~p:Kg[BK'n+$8yyb'EɘȒfRT8&X֔I}2D^ɘyݤꓱ1NƭvTMqS;2N4I;'&XjB&35!hLo]8!s[Պ#іgir]a:c8괝]r>vx!0s<>\ FuKяjtor>9tDc>LƜ 80s-1XZc:8N)*xe"*D8ɭ)[.aDx4,fPNz2(#gdLNPruj19{}?g9~#sl^K19 fLqI&br]}SLWJ%brBI?cr|ٗyLsZ#Lgbr)󘜶CG~fPΫ-E@Pr4}Y 0{A{hQ/>  `GҚobbQε!oLl^ [xMA\FvW-}}c)p[*mַ `)ַiմpR/xnW:ȎO[*.խ7tߟVq/W:8.oyiyKx_"\*-s)cy;lSI%ay;ry˵ +*[QE.W +ޜ[VT͘/p/Ho[7\oŜ|} c;U'׷=\@׷y=ƘO_26m[m1v?6{n7 }6knFK˚e~MpųLj?ֹvhhȉWͺ܎$Ǥ A>r s5(Yy "5SZVE RjXͽWH$Л^&V|9! mq&{5wnrduJhz|dKb*e` ”bCY|^]CT S궈{^air>-a;}fBrI# +&"p.Wsmw|yK8G%6}PJR@\M}6QO# 1z`q[mjH @byq/K8EJe1w_+;u$Z96gE&tʴjҘŜBWdIN@2)GW^{|'hĄbC| LHzmr%u%lƔSmf2T#"D+엟2妩MZlC|~ZIHF[߷Tc)a ݴdj.FC!`MmCe-DZT݇h |ˌ+B +7k F+ jkF<.k,+R5; +T|JVJCasX)jSɹKZ/oyuU_Sl6}.& \GX  Y]9?x܍@c =nLE%Ei|'c%hgԌfeZ:HiNּ.B^ ܭx)+2=EixF1FC9! ;r + qRU?9vr91.r,V;%zy ''fI6DboZż[zɫJ:v G'Aqc1`11Da%2WyycqOkvt$퍗8c3gt7epgҚnEњtT(z.AۅiߎA3Q䲵yN'cukM z8,lMS0ULi;Iw#\)7N0yXiVE)XinN:,NgģwҀbPPc<-3HpQ抅Wieǻn""FJb臱9>t @z,ue }AroJT4 JNKTel RVIAb6ZO,&["ftm5XC_9Kf Hm*Vj ,5ycuKZ+AϞZ1_ rrM4NB0-r-/ZY;jNgeڱ6'9%?Nm Aoo>9 n2ϊ:gpG[3l?HYg-lGp]g&;yI]uηkU9JP?gt^H >=5rJ',4|YtErԸbхkHKBhԡl pPzE@zL[Lzrŵ8#Zd[3ޏ>hL')mGB,ٞ1dҧ@J*p7^!r~W`2yz-ќ/Q)=YĦTZvʩWjqƜjE9}ZOp`. Z--$5{|`tKx5,xPAv;HT]J -TevxLLj)ƻ҅l 6+7$/kӭ$,7O>@V%-PP?pWwR.|gN^{w4< +"3[#zkb^I +͕e?st3>/JjsB7r^: !5f /%U"gmCdǥ5~rc;垍âPF}/y RB_` لH.cU^{|׳z.ٗ ڲW `b2ԾnH{Wv<,-'cq/ζ.:sEw7K9 +}z܁g0 )NFd~dŜ>ƌvG#p:}_a"C9dvq2#S}s8e9Œ4xi\u!:CP3'a$A@NY +i-S&3ЧRLSnf3rj΄GN=S2Nݚ@Xe\Zd&\y[Fwf"4;PTe*,.sgF7'ҝ]xӞ;~{5] Gg Ù p{3̍Nn~Ps9y\2d>v\Yd6 ڍ%J$LǂcQsgc\e{Ze6.ɏiS9߷A+~q@ז;>BgILVUu%3 :q~op ?h_ v!*DB5YEqoatxGVknK jKz]ç[(YPZ!'f0XJ){B%rDmLw)sqzK1;ޓs|$3!vvy~N܉`KåPH^>S|ҧߎJHS7(nj7m٭k!s{J\4သ(*/ƽ5 D]hŕN(ɮWRַfCG22~e~y7 t_sJ>|gT>ȋޟ={1')~]cBnn?? Z --[~l!~l!~l!ݲ<ݲ|ww{W S[6g[4g[vO=oA oAlA>ue]E[vO-oA-oA-oA>e yoy=S[g[g[O-oB-oBoax&U +#yձ]^w]^t^- jN.y5^K JaݔWT?#(;lRlaj)ƱQَ&FKXP9->9Z:$ZC4hT]ꫡwꫭM]_m x + 5 ]a >Rb p^mJ\(FmhÏ>$DSabR?m|}J%VDžl$~ ɓv?{([BM^vKlW?OХ #RKLňSӈS9"TH.15 G)1QJLp(%b8JRbjRb*ǣ.2Qטǣ1QטkLQטkLELxUb<2Sxebi~ :NOp?T.lSy HSS#&V4EFMzҺ{ m2SPtu͂ +_{[ we;FQ}Lkד/oxlGV5bAye~|F|+u=Vi +#Ďa;ٱITiE15إl^>u*Ο)?3Q]yk8Dlk>;+ 3"r=ZC9'[ʷg:ceye" ;|n˟w$ÍO)oʈZa=4J +Y`Vy;T ;[=)_GПj>5Hybve"Fev65Rr@,UgEҬj8e3'ds\{xwooOM>(W5߾oQ9/ʭV%0$Hw/RP{% *<\)LqYTK=7e;!r_γ{??ٟH8a\JL}Jp"]s%?F߇Γ߷c>'!q3[EpvW8Ocи~-l>CZ7mD^$͌J.bjxWͣuWAPuQk +qr_o:ajmr_誱A2`[аue4+ZyejY,VCA8 ]~zzM=)u{ifriEV:ce yth]<5O7KcOȲj&q=]UH (~S5x<4ڪڋ{]?CМpv +R,&~O>+I]xPTͥRh,/=f/"QhWrX#^5>櫍fWNͦ)8Z@׶Ҫڰib h29VTф@&-U>xTwnDzGO1+n`{A4̔C1:#y \% F5>ǬH9(VPBeJz +ǬG{"59;ޯRuAKDvuq4唝ifOk:Vg1|rWhOXF% &thV2]u:|wB807GZz|TNO!_D҃,^kѽLڪ=y+阽v'J;5v=]|!|dMuqo&;^݃cGeq/RE64gXҹ̋v6%P'd +xKm[qQI'|Xތ#cywnlE`nd+Eb)IY'UB=X2,zZK.a,V@A`PRwc!fco.VܸusGA#/8bs=WaWwߣI8ȬII N%nQ!繿KsԚOwu(~CPqE`'2:GY@/$S>ϳYT#vhg-ked EoPS=QG[_jH$ʫZ|~ImT1-_} +A$>u +@˼&ƨAWYVcOӆ^rc#a7*97@P(p-[TU{<_sCxc\]$z=Uڜ P̐Vp3>۞>p})A/fgM)(6>5^kT?iuf&3옍ѧFv>s70XX}Ln_31h(ņoKm^Z/MR z^bZdcXX񒪐n;`|%H' ˆrh]P< OuǷ!o{_ fò*% +ʾX-ܣmQ^/:Kup1 Yǰb l@N;n<g=&=ĒWU¡!-,@ AT,?K_eb^XP1 W;Z)VEWzۦW^J,I/8Yuӑs߂;.T~Y YXaj VXv\Ҙk_JYkBng)]:r$rE5VM8V }SAzd +_t E̝S /#TWF'Yc"яikJLң5^D@'oW}~#ԟPĚ'1#nߊo/OKFLm~_#u8d/ Ɨkbf=u)?9Hd3ǑNMPsL(k[%3< '6c9$gy36{Ưs8wxxQ"n3o=ܫz"sX꧙.C9fؿϙ"9 }41kt ygD.epm"ݟnRv3.W&,rP݃Ƭ6*! 2Y680,~o§6Ty4 +M4v_fGKR9'JDHMaz:ٷ#CKk֯؇a$?Br,~ ,6a3 o?aܡ/VGJ$WW?b.M~+j՚#x +k\k[(p]jV(3p+}PaQǃsCKT oP1U[Zyvy,IP +ghQW&4]>[Ҧ sPE6.c/sV1X׏?4^`t&vvüH 43N2 S"PJėZTއS;nC(*E`dNH:{78TVy,.ؾ0h`rn 3A>8^M8v@O[23 K2\38.Z(OgGKÆ۰Lm>7q}11U.J>}*5=/+U@T+ ! $;#xͺzJWz-61E}>?  M%IX!ȓ0/^s|.m'62 %no/Nt"?lq7ъJF;ESu.w Yˮ{8X1 Vu*J\B y‚D{}b,maf5~aڃz>W}yկk5Mt/%0Drhy7zx;m{a42f].9&viR5/Vͦ3xo[v;& i8h#[kO`8pH>8e<,^~xy3;a^|ӏ:Ey1o- g;~_AW~_꫟_0@MRm__c7?~~?]=~CoO?ɷ>\or~w|kPw^_o__k_iɰZ)cl;lu~W?t |?;[}˟Cݷzl뭓?{ƿwG?ɷ~_ן/?[/|ͯ~oGc%&fEMITzIO_w_XR3}њWNGo_;Kۉ1eǸdBkD' 3-oJ1_5"|FalZNޯ0{dP+"J#g@_9S +- "Zq*iGj'UF RA,Saшm(L[md5X(\>Y$۩%GݪUsX P2/:Keh&5 4irbv+_Q2˪o{3 )ujƈ,v`\d +-zJv(5U3ݣcS +mX]YX1hacy%"uM]urD wJ}u8$`K@׭ YQh`5UݻNxSn{օ6dx ZǪHVG*^Z"XYxccO+p%$.yII-?a5bg7*Ov'K|RVh{UJNv +?ZX؝E܎ ]ƚm鉄"U-ҖN\_7+XɴSIgY,`L()vT .Kms+eڞ2q2Uc}?X<l#߸-Owf+U9V~wezҧwFHPKIlϽzo6=!i ++݆^q7hiZuu٦yv V6meUYmJ鑂a{NW61؊V'JI~=Zkˆ؋>%/-ʛ6)܃PfJYouxThӼ D55LU{!eKʿ|t0>1yAc5)}"bt6́J;4nEI^)uqm啧 밑K9 ܪtcʜbƃ=rpu!v0ijFzAx1QϪLhY춖${+ v$u#_C[63nq-|OyLkLsJ0MCe΅h2Q_e=[k[H +zXu{F< y^[] ꐏf1/Ei͓ G'cЕ1T.[wNbv:iYe1֐h[-;(/eu:k7&'Qe4m"Cf>Ғ`W 1 ϴLl5TWӈL PSo>;+߈ rspӵ4"FaҊ +}N#sҗLD Q,h"v'r8nbӥFW4KLB |% #.6''6ĶpIT6>[~Jdc0]J[\檩SmtmS骧G0fP|Or0Ozb0^ 8eiR[[g&=/Wof‡1wMj]M5$gA |cU^jY`*"f:=VNZ +2ca $i)K)~{( #M*AI`/΢@tnlPy68.f[iެN +YyG0@K +;ihj)h#"ǩT0AI=.~QX9a`E=Vר؅荜 AaJC7, vk"V+MsHGFn%pR9!1˨,I:QYG#$iVX"KM^#jJƁ@cuȺn?b;=B,JPk{HANbKxݧ)(_=0axvYI=Z"b)1\u J8_SXf4YH"_~ +ķJGJUQӷ"eU%CI9>kKpv,ٔ8#hh8d̪fY>B=5">GĞYcf 9Um={: +pQDAlϰR?Xn직I氓n=MeD C4GJpdXE $>AŎ'+ߥ9 7laB;,hl†U:b\i=*d4 P:mXҝf^[Te"oEIJVvugrM D]mb Yƀ\=*6B Tkݸ\me*Dg]k{nt9A"E,rUz-k%Ox}K?,E97M#:OB2(K閘-՝۝QyH%-1 V`@Ms;{[i +{;TFofVGgiU‹؅8,0ʑE Ǟ@*?U&Riv$榒#[d+$>Mv!-LYc?c.p@HfsYt lj[mG(Y<^C2ViAhRmȧFPuNl'=ĵX-nʢ/2J35*YW7L{!FY Y=HQ \ N5$X];bshn~,D,s~XFv{Yz7$4"_DQ&V`XuҐDF[]T#!8Ce;\jpx0AFqF@+׮Op*Gvf>TI%^8m%"'bâ,P6AS)yd-AɧkGơMē.d!9bvZRw2C 7WMyX)rlGr|'SH +P数h[Nd7F$jP`=VR?I$m4o{kϩ04#zeވEo(RPԁ}E3j{3%-v7nHiAQVҷUx)MAR莩nZA)i$MJb:-vlг1<+Bp-dYWbWrcrFe/5B \-TD J F}1R_}IIq/G'dg,epEPgr*Ź?J)Fakkù#z?>Cl5`{l )CM12B%R)I)2p$q[ʥ.G=E7)`pʜ1f2P]C"С64/j/eZ\prrHN[z>|Ʒ$/Ьj1fT1vβ:i" @A -<\bK#B=+nvLc,x̭;wkSbE*y#%{yAyұ⒨ZZ瞚)G9(f KQLctRJН#ޢiݗpTYbh/GەBWOJH C󑃠F3 s\?:;5U^ID +` ͵9htLWco%RXqXp,nPr(X cŮABܡ˧VuرFW {؅SĴKU$jI'f:M~igyuiXN%W[jDvذp ŻDydT&'qX,U-O,Ia=nd+۪B̧ ֫HLA +SEy(^k@8:#w5Jx1VuS>Ѡg1w9X¼)6} [a%ۼnQY|VU35oqhOڍ$e\(_}#k76r ՗hŏt=(3ha:?na85p6yès1*ZebP`1jWaӿX9I"9b1)JIufF JvD%"I\$: ŗB{Qv+vzĉ3PJ gE ؃腰HѹXt#^ʘ*祙jyj%g5R}"!MUjQgFa6'g0UKd3U:}Ъ4%]MLYs>(7\]F\N>8+@er+YjRUC}Z gIՑ %[e\Wb1n]!!@ɱ C!$~ɲ5&mk}| ǁ2YJ93T@˞E +5X @+ аc`|eXE3} +QY\ +ԈJ+,5rZRiӥdHun FRiH R&$)H&gZ[I^4i h w1ehJ>T AQ'{ͪ‹i|^o eBU V‘J5RxU-刧I60ьX)r pɶzsgh{Ж^mN"VO U-\bXfFZQqEq(/%&jBҢv~+b|Tz4R]=䊹EY"8r򜛗!as0i^NљePVpQHVZPBg1Gm| y gĠэ_ɘa-0d}]|ZFY5SƠՂN6.O\zY]rh%jvsdQr@i߼l *|bOE|زbTqXjgSQzPKHEs^#@xPR-G+ +^L*`1i,wbU{uXZcJv\;xת2AbΕݤ ۼ/zBM/ ܘ50O%BXQXmiJ]kU(Wy #hP,5 ˥4L"͢Su?}G +Gm6ד*ƅ;so*Rw-RM;{*`*I͢IDH[` =ȡXUI% +_S*vΘE/ԯPC}Ap;]aw5a, (*<[ j|Xކ55qLzS?}iz=b,xHlqEMjMѱX*WUfYwObPV%beG%ªHpP|c*TRǨuDҶ ]o*giggBVkp׊xߥͅY6a˪?tDDz3:5]E #EZ{MAE-?^)* }y7tA|m0>6Covډl綤 RtiԌw* yMv틓ůOxHrBM(O0E)z $9r<,~ݡk*!`@a` z7u9$^dؘ + nZRlfPe[wu$̨ǃ+Vr`~F8vB O9 UjN~1: &1.}w^0N*RP @J c{"mj[iԪiUIhgqYrJ%ȁJ"EMn͆|N?e5\Z""tm*[e +-%u +]DDz)N?"ҍJYHDɿ.jc>}%i],e(V*#"m?tnl#Yx[9jUJ;`)35fnavIdZwZZ\ ]R]t:r;^ңYSqcȅӗBs4=V|լ;ܾifmkα4NU-|+]Viix +MgZQ㍖(_E{N;>&E"\P"Op‰öӴ@0I~dT1jFy1f8jēHB}^6')7¡,<ֺ/L[WjG:%Uܓ +IQ.ꞦHW^f?WZ;J"#ta5%WiFJ|GH#fX+=z_; +,_SԌ%&A6%#Lu$Rc +j'S?WjVp|/fqu}[f9rFy pYbe E4Vsڼ%Rf0wew; ?Z B 48#J<0@/>.,YPEuɢ Ϧd&iVC簚 [^^.1QT)CR3t +V &g(C[wbAusR(4멲R[-À>3")QśTäoڄh+r"P+F +m""BոX3 {6,]#Ķ:0W3JN=~sHTI\,_=} 2S&Q}%>ټ=O%C&90  i<]#rH1e [oX--ɪQ^;$?֥O2|zl! ZHWgQ& P8YrU +C+K0?[nW5VýcX.Yy)SY2ԥ0)2#(c&+YI`M^Kh:g",i "ialNa\-R zuN)p;T\#L/uZwsFU8CԉZVtC8OϿqO"_N +j>rQE 80L"ݙ@Vpy&YQj A~`2Y&m3t@a&ay +@V dbd*"I G@VzJ5>yȰ2,{: L։@&D +k2B8]@D #6N Chk@ #"W d\L W-d2u2ȰdXg@E# @6XY=ȈdR9Vu8J[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'C A& à@ޘ0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä '6 Ȋ;\H +Tw2& AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c$dz( ddis~ǀ +2=dn3Lwv{"ȊZY"d@ax!J-3Xs@uÀ Kc 8 K{! +C#didi Yڀ +BEYxD@OYQ@ݯɌ +W{#0Nd1"겼d' AV<#ȰM2F OYQa@1L(3U,/ AF΄ C 8!$4"$0DdiDO Az|Br}"&OYM-6Gj|@D8 2~ 'YYAFx`FUTF^rDU'YAfL, A&h A& 6L44L)# d KÈ FGU֢A du[gI2G #n 8!0LZkd2{'ڶ AfPA =]8 8 Aƛ3!Ȅ+didi YU;ƀ  YO2 ˿FYAA&Xd| 4qfsF AVF)8"0L2bFdUM m  A=!Ⱥa@u#骘1MǛ@+ dFw2 24t'yd"1;Nndi Yx$IE dR| d(>dJ d|{ȴ2 dQ&Y;A TnoY]@V:juG>H + +:{%0nz&&> d23 23<d' #L'잾g@OYa dU@V&{ +O2-}2 LD d@V$6d,&Y_g a$1 dܷ@V"%ܑ@Vd}@u&a dE]O։@a"iHm$ B+@u"a d L{2E L <0i dc ,lA +"B@V(=dvFYN xddXf7 L e""ad\D +g{r έFY&Y?X dD^gbߋ@Fp )80ȺdH #&a dXfYI @u&2ȴ@V qgYn D + ׉@F\f& $u[GCߛ@n""I :ddE u"阏2,o6 +@6XY~ 2"\oYَ8D +_"Ƒ@1dl6JÒ,VR|$Ul n YS8@D "Ddydd:D |2"r@6X:l0(2: dZ@V z~@M +!29l n Y!b:Z2@Zb&uH 1h2B/Y@Fh&xȈ2|Ȉ2dlgO' +4:L-@LOG]0H$h+du2m7Ȫ +OJGD c;ȸoy 0Ȱdz  S ݙd #du/Ydhf7  f# @& SdayȔKdV7*0Ȉ&2u?dR'y1:'XUyM1n?uac0WcL1Y^13Lc.L1o3Ll?ƽ}1t'?V,>LjcXg_;|ǰ1Y&,YF2~cƏmǪ*G?fCp:q?f~lďՠb~40L11G #~ ?H:Ǫ~Jc,cFc ?ďU11#~L1ďL{=}ǰ66ǰO0d_1Y ?cgc'#~?:XL1J^$'u[Jc&scN1ab:Q1l%cD__1*0f?V~c%rX?1:'b/q?V^"Ƀ?2dy01Y&k)c#"ʃ?~31LjcDf^?FF+6'?1ް?ƱfX!Mq%3L᥉?91YG hce3q3Hhc{sVzNJ˭^&[c21 q # 㹔aaRt*z +LE#C)9̋?q 1:90tq:4embYYSi'1"8^dS#1M1 +F'%k?Fxfc+:4=c$M&jT?+0#c<Lq?VT ;LjNcj<cM'?^i)ac\+!?1ۭ8?V`rcm''L&Ћ?eO"NkMC?vic/l#~L -8~{c'W80;0hcďW9V#i>XO1VKwNwa.?V$=0lFq1F-cEcJRrcxp ~ ̄+c +~B~LV~cdfؐpoXqfď:Wl>qacQ:̙c} L1,o֙>{8dyǪr},L"1N1^>"}>ƞ3}Act^ղÑ>>F>0r&j/%#}DKj1 8#}s[EuacUʛz*&}L'}2>FDSI @SH#SIquu_ ǛcDgk1܎1G|TO>a3t/F,}L{c?N1䕑>VdByǴD 18oXUHFOXjѳ1hvxT>Ǹ>F>VEDc>}̺F>M:ԃ4dyǔccjx}oa}ǒ14Ǹ7}̬Oy>K>lc1)11#|Ltc||c /z|hUN#:ѝcE9>F}>Vu}c +~HM1F+N9r1c* c*c2cU>8|0N1FmX#| v%|n c}'ccL1>ͺ~dNddaxdc21C~bQ6$O[i5ptX7 n\#tXsŤ/ecc\=&adax0N챆\kr1'B#{=1'j +#1 _iB}]1@aa ՗DqU<$311 + 8bo,zL6=&@a}c. +z5bxǘG=6zL =eFG;+I1豢\=S.kD0Ǵ=qD)9ԎD)8Ǩ^c=cQL115=c21F"1##zLq#zeDQ30Ǹz>|B9zV=&7zL =+rL1#3zcH-cjc̱3z=&Gf9z =f =!v=Ǵ:cf+7zJsDQ87ǺeD VOԫB=þz*#2T7Duk&=&eBayǴncu?fA_豪wDce@q=ƽ~$1c0Ǻ5c*1cc=لF +$X{@1 =7kDO1O=Gvzdc&z+15r3SSlbBI7vDU1 1\ =F1L1%=c'y, #y<"<=cJ1 yL'yLƁ<Ì䱬cD}'ʅFX7 ntXR02cc'XUa<&<Ʊ<< y,AjcyLF՟cfx1)1/X9\ z%J=_/}2@Ӻ+lb؈ +;됰Q_tmL8lGWEJ2$W$J0mv=pU$@AP蓮?wk,L7sAbImM0-ߠӊ.~:(0g;/M3$Nz!o.Wnؑ`Ah iu: d,3aK#ţӗjG. E<+~Bo=%oz ~P_>YN600?^8/{(η0T7&((\Я-$6=*0w68ɏIEg뽎zZb0h4/V:Haޏ!ֿ2kgpUEaɫ]B~;pRB~}͕_4Oϻ_XId1}K{(/(&`XYϫ`yNJ~{st k$5a_=$ ֘o ྔ~VAҿ7f$] %O>VFA}1mqT3uN5SHMRv _Ɍ6dz_6½Ԝ=Ϲ^~-SSn{KB+^-e*K-ziqv%ł-XX/|֫Qe[yma07sक^-L^1zau0T/I>+իэXi`XL(^W"U^řXz3K?Fbz +iX%dWjLBϽ]x}i^(Te {5hmSߢe8#2@{ڦ{m%ӽtf-^S^Oo%łsA2t/ǵ^(ZTA@WUpUo+t5ܮdGнP^[ }X^zJ{3G>NBh mݲ|Et㽖P^[5E=jGq{l,x/JLc㸇xDw{ae#קD1)H{Qj({m%㽶x/ CSv齹^^6V}ZR@y`9٥[yr9 FznrmJ&{ƒ33^d/) {ao+^j~T\j {%%d/y]Į3}Q*~#R%ډcD^%P;"Ea#8|;}ےu7|VERg<-$$0^H e\Y uPxI" ݈N>X96^g1Tc׼T6kk"%\jLduظD ωu7V2K&3Zf1dе][HȮ%K9* |<i9`V2k2uإ'/v&.}Fׅ!;{u1|06K'2Kѽr,܉?HB&v-%.:g4=8 W_}L;@*QN>/]ͺf%vA vqܠΉ]R]<}7YNz*bUdb*@v?BvIw}d d:g Y>+K=%"qEbrb] +=46PX.>K|.Ep/!b!H]L).a2T!/yB=s3|SQ] uI2@]otiK,00]#ڥZ؏~ +"t8Gt]8ZJO}7wԡZY\Wy>\sù.aOes~vaWmg%sɻdvƹ\$2 ;kepZdKi#\*ٌ'VE"4\ o6KIaasvx߱\R,f`.F3ޯmݎ7F쓎^\؞ #Eh.B|tFsQ): 4A@e\gSBd.o 2;dYzaKOT. ;^LǕ:\ZD&eJ;'#cokKR&F4cbPGhǽ [Q[A*cMAغ_2` .?|簧# <])ZV=Z hk5J7\-aVK0[n>d ↯|5{n^&i)='=}E]NtU8Q,ӗZw e ;z.mi(5u\1L/aZҴ[ }PZ'=EN<i)ApdĦCʃ%5 -$a`"hf l~P%Raг"YC0ǽY2j4h,-f^Y:Clbf)y ,T,L,2.KPy-KŴ,KfT.VN"ej^m,,Ͱ&esStld'p, @J+ ބD"'zd@(Y?,kgߔ,5$3%89͠d镵[PZPԔkCZ.H*1ʀd Hk2{A@u>p*֞ Ҥ7 $9;dQ Bx0CP)Hw%:6ـd%Λb`FDFYtZG1H(:# ~3|7pnFv$Ə^fdk^wFJ~y*#E}3P$3 eJT# %)0YEGXd)| ,(}%oG, &Ky7E'?,$H! Y(uHn:$˲eHvuoH E*G7C>7$ +% +s-ApIN0 Y@OT$ 7K"]hG84 Yz/c$JΔVp,&EkS$%(Y *-H*oi@"L,)ȐfA}CJǻ!YzE2$GFd-T Y-L:+A[* Y[-ZUŀ< wSGh.<&P/ endstream endobj 201 0 obj <>stream +5 y%e08dHmi3)ڐ,eխi((Y + +%DhdYl45#ãd)9eYLM{ +fDEe)YʜYW\Pf(YX=FdE\ dO^E2%"l^dє,nwd&((Y8jcS8ed)OD'(YԸ) JEz)2%= J`P,.f#S8RPdwJ{oQ=l]*홛E5c;&#}`jբ]~Z%-ARvduFO4jՅj)Y4%}̔,oNc $z\ YR-Bk,v,,\Ep`,,&K{ NZӳĶȠ,28(K'8Y +6gNJVrcndѡvc8YJ(@Y2^) K, Ϊ>XY$0zYYn+ Ҙͼ^*e_`eiNPYfFj,,vT{EĂÚXv,-7+K0H L_zᎱAY ɒO֒AR@/3~øf"4|wBd;#n?qOӴMSHb0(ra~+,#ˎ{adY'#Kq`d5&,Xeut"K-Ҹ"Yz穩\U[QYD +6؁ҫ}zsyߙEme%RU(ˌ,D*œlN0#%[dnPAꄋ],,2#H-$RAybda(q:Y-Yx+Yh + Ff`dI`όO,bjU|p0$hbɈܵY} Y߉ du9m9da;Y/%bT}:.{dwB̀,ҿYh $@nY`_A ˀ,MD Q]NȢE&dN2`D<!LbP%,HKy&g@f YF)$Z4Y4ok´*JǒSXR(@,|,ZY}'XB9ؗSU|,UXډ`PX oI񂏥RbXKt-z>nwbkciyJa;Fzmb"eJwPhK}Lb֧c"PD꼱Y^5u\^dKԶi1t &M &S9X[lz>9%b +O:+ue8VnW`n~XDe? +8/"A}c6G_QBO㞉f6kZOx,"2fݎ9 + ` db6z|Q 6J%@bxD:WOxJטR w%zvFK@;J! +RuE,yس#sEܹV<3JwwΕ|Ij mE\)BmL/@:Qrw[llhJlE/`dZ6KX%sڃ2J3Q0V[ `j[E+i%^=AR ,V:fij–8xV*rf8+5r2tg%;}e"$ӭ +Sc/;+z(+ 3 +1QK#y0e +ŠR&.'Xi6l `įZbZRYXYP@%E+=҆fߘ2WAnc3sdU09U|/ptV@WYEK+g<]EO*lO7\*q;#a[Ux[aU&WOڬ*SGαUܡUXOCR_#x +J9wM{Vq[jŭ s$R`*U*5fnсfd/E\w:ܫ'ME} +ꍠ"cQ [՘Zl)}[mxa:ɧō$(ZĠVi)A$TtkU=読#\ܪ%dp\|ŮjO*4^e˿k2J_ЫZ[*xbWy;^e T*-lGUk]rW-%ë*U,G+* B*EmU0xj^E8zص,%ëL )6+UXz{Wρë$`*TWap*MA5֢Wα[wz۰-ywbW*sAN- +H` DzEjAkƻxἎRMjwvUen]Yk +; Cî]U4hkXaĮ2q&'QRS7=:\6g]\e]e9J1Af]]EPkRQ*$è̮R(Ixռ2UK-:VtIkm]!ԿBW!(UJsX䊐2EP]]E BBWmU=r;RJzl QpR׺u%tv']–:U +-Uݰ(Vz 87JV.%j,5UM7/*5twrK)>39%BUIT)l)%lyV@ӌ0eի"ጠqY5G770Ѫ9A XW91x^\ɧvA[51^V=Ә" m|jsëp460~G*P 7&%f|SqJ-+b%[';!V͒RŪ4hՂqT&;`ա| V,nY7gңG"Epfۦ+%u:LX EQ6J8K5hTI݈VC;_*.OT~9,v-x-·(*@PѤ3&=ܼWkh+6}[[mLxEᤱ-"R9,Pv1KB#!*vm3EVvqDG@C } +I] EH9[Me+)_3tj7Hp;\6|^[NNCiP1dg_kJ~c޴Ҥ0=[aMGp;>v^Q0ݿh_=EKt:iZe.V^ʫ:) w]wtJrBQJ35D5Muxv"FOeOJIXMkڃomIPM|(hCLc-- 'g7u_%ا[G 8 +t})oVR_j_عS "]6?GRl񧰇q2>fg3zek aNi-/ I0@ +O/8-=aඦ:o!0UO#.1R_"[RxN- ,S dau*1CAd +uQH5CބR.S+%t"0bWaCqDVP20:bɻN#|Gʘ.O,֩ -nE2۔|)x(+iDfO7FB AD-6ue+8\Tg&#<$j0,q3_#өଽcxFO,~XO"(mk<.TIFB?oj.AO!U~C :!M.V{HUS0”Ʉy(cƪP8 xq[T!KMZlNmWV88v7)iVsiZ Π.͒m$NuᶎSc^Xq+*Bj=Ouind)qe/x89<֬?w/nJ=k( +OKX)qcsN\Qï6()|}Vx&_Sg +˞kn9amooNJ2ت>$E^ +4}9w1X]WG̮ط:YxzTci +%KծF>L,#;wv1(V 8ޭW=n'q6S\XV2a%Ie)VARazjd)cmK* zIzaෝ @Jx4~WʾQs{U/vnyAX!\u։Ͽe3 o޽ zM62) @́3T8&0Y9MĺH^E ؊Zf '{uj~̀ZS*QTnG L_+Whtl5Y=Pos8E6;m46!LjeW)԰wgS a̪C@,ma,Z*qQ$"Kw=-4曲aRUnXK6łaKnf..#fq٬c%!LqXAD?X:#:D؛jz_uI$6_}hq:=֛wbFpEqQ:`ZY.en>Vmu#<m۸麬>1G?PڬNP?Q"S ۝QBa(,U{/ƩJdXt3l=n1PpiUd@Zm !ޥ>>m_ٝV_wݠ5%~M5m_)gP䁺 45Pm:ϤmUqu?#nI6$05ԇ8ԣq{p+R@h7qPA ʊp +h)n3[vlVwb9-Zi^C}ʉMʸ#f?V7Y2rJAY&I1ST>y_sbRR1C!{X3rmXXK:i~}yę4Mer[Q3R_H2)JMv߲W$pRN{qJJ,DGÌCqYBR={[o6!)f!l$h0&8NF8|f +-V,4:uu^>GlN [hʬ)L>EsmŜj,R\aE'eE34DI,bB +BLARlI9#2IyUzH:r}T+l ړ1&CBǻbJYCV +L $['b +1w5(3_- +)+vRzm5=!:?6ϑ=DŽZ^3L;"ƤVXvۆJ#cRl30&V]|zm6 ,kq;$@PjBweJ/=r1x[q9a [ Ҹ8o *j) ˜T[jDeq*1{1Nh;`i;}ټҫ{н=f`AUMO.ZJhݴcu0T X +Mu2R6Cҵ:a@RHOO`L7OcZW߂(-d.6D,/Q}O?M(C&1)K": X)!ˎY,2T*Pm2JL( `""l𴳽+;k8O,4o+"zj6ɷo^] +"w?Ҫ|Va${0ך땟V+%n5$wż,Hqn P /_JqaJ<Bv,cAN>Bą#tco]}"쓟M#S@hUס#!G6Dn3͐O{< G+-neh:=P7+۸n@"JsBMzTZo>mרڪ 3/ FR}֪e3#n0Id-I +GTt$JP4}1wf߱q${ji` C!~^t Z^:UY"oZ1Q2u#`Am]Zش)r:fFfNl\҅<)jV#:=J%&1Ð[g*n\_$cUeR^duK$-Ed=k& -G.ͰL*aLfrMPtr;:8\=i|T* +$ǻWU&TokS gmPKѐ,/}LOkqcbpL5ywmk;pƽèeŅ6PΩV] R Vzwh~coy%&|=DX1,mxWMw=lW2 JaN8gtZA:KX(^CxneJ/ޙNtn*_V,[ f+V o/к}[?Sh:#w[s3mLAhZ!|v7+ez~q-~Y=>ʂR"L]2_<)Aʎ*#[><@$oy_wѕ!QZ Da X*UlOT9Ak=UEyV/K4iln 6dQòycU w+e +O[Ɏǿ*(Kȶ RPXC\4Cɮ8HyN߭-NB +H֫ERQ\ϟV0fNPSPtbyW^RlUMrL:8j <&*PR9YC +iSDij?&z,j(ݎ\5T$dKyQfj[L&A\sI5K;}ä}BLqܨ5O=7ښNLxkl/VV?SNz Dh{%mةx:MBuoꚦ$̸N_ɲ$k,xo'Ӛݲ0uM'!u,+ҙӧ榮UUo)W(P]̔h;NQ 3¾awBTʪWE)jD={vM1t#2^+vNߝ`w[)),?vH`$-x[7i,ʑ_$ (;ѨmjhRbKkW#RcCCTI`rJf ݫ D'i}bv5wM"[7;LyUZh`i&Nriog87v>M$˂bwHk'X~ wMkyDfqM]i>qX1=^?W(N}6Oy;< +;P*r]6$† 5Ee: %b6j0f=fUEyY\(6EOc4DiT\yqNlf~gi;) fa-2 9&`{ތ{@lYZ#fٴQ.8pRjPۊp≭V< Ǭ wy+tVmի!Y7w2T)xB=E%tMO:w4UlZP"9Ie )pBkå(Bh5lZaAʏǰGFM4a:0yLC>@]+GJ`lT/hCi7oqڨfi_6DJrn,`r: L(zFmh>"L03*i']Q&a1'r12|Yne#3<+#JƻwVI-v&/:{ח8A$G'Z%M ch`W*avd/ˎa%VK^B..CjV( gZ0p}t!쿷o,bokx/hc[A4󭴍۪ giC>Z 7GefPn:" +EGD6^'0;R=7W"ž܅Ƨv5 +۽`䎭AÁ4 KcݺNu\2邧umK@vrJ[n\C܁*t?-WI0/?X7۷ěQ40WPkeC T;>^:?_!M[1cUbf(تaǂ8i< +2TDF{bqL +@E{#fqoL s58ӯvgӴst12zat^J8H}J0^2dHԬJp߈?AM5?7  F%0h3S< h#Ůz򠿡$( 6@ pXNBbhkPg{Z8{P>k P}Fm+ GwnO#̙(UEUr[!V4 8pyko͂;I̙[I~0ln63M~K{}"=N/qP %U5)kɣ@oJp_6lb5k7ptBu/)'Z+⢩uNLDfq^ԉ0ӳm+L7z}6D)kPjn`8*jn}W]*RVS$bײVxq?Q!Ygu#MétݝnO ,Euk<4,[fV4+D}mԞ |=5_s3baйKh.'̬ivwOVQ6M:j˩ؓ>!M 7d6Cl`nw7mlJq鐦 @CdyGq O^9kMy5׻{:h=RTR׆ u98 ;M6ѩB9͛*}xxqT!(z[/ + + ZhG@u@Vrnz)e$'n*n +v{3̚wץ/Q甊?0jW)w(O۸љJsd™T-0(i}~Ћ/ΩOΝKt}{wƈs9DXb(eoxm$R^aq#)G 2ܝ2^ˈ)dE1ͫ,E|y3mΒаϧj$X ʫ2fzd|sFS-lC'*QO;nR$C +oN峢%B4ԓ<]ZV|z{5Y7÷,(#T;S onVm~JIiF*j3Tz cl xpEKR9}$]“yB6n +od+'6y{/9uC|Ǡp(mdD@| +NNWW|%/SйxDvۣh& bJ_ +e9҇&"}n/XB$T}K}mC6ASbv RKK ܈⠤:*QػF8vTPg,&{kqOmg0ݜ0P,`ب:IkJO +-;D6Dr/uuMҍVn[KAKrCQ2%~`떺NL4+ i2: q:i`iV +YvkA<DNTYqö:}rhdHx&vQ!tݜQ+Qkj^`Z}cHo[ 25S{%y];q[@+N)JEK<;% /\Uό` A3MZpXսYZh߷hxt\us' 7=}oߌ@c@<g}xl qRU@e"YouI."Js*p!""b!d"/Oj%IDD<T")?~3~xR+ +Oʇ|!♫T&bC2SLHwZP~x +Osd%uZ\"T|Bp%Id緈xE&|xrOg)xX"D?D<ŖMZD@<'T gf  p +o uf ÄQiH@w@@<} +Sqm%@<<TÃ,^px/O/*8<]/OjI8"hND=]?z3GҌ*8>( "qxGu1S$ÃTpxVޞÓjѫaL$2px(!-8~pxX O_P>8A gg&>g_8<3Xǵ*8e'p,4<۳BKI +ᩚK2 mxq8'$$)_ax + O_ +P2  Ojq Gl!0,eXxd + OCG Rf(,<_£ةXgޠڠ,<]/ ٯtY* 6 O#VQXx(#££(\,< o#6 OheQ-aAh(,<³c~Yx|^aI,Ag/ owu),< _PYxaN,$<ǂP OJ%}E#!($<$<& ̟2 8C“ZHxS 臄gYLSh:5u$<+ o!!J!Q!IxP OрB-$ϿT QIxWHxR$_bG4 _QBcWHx$G~IxGc!IfB&$:Ͽ$$<*JJ B]$$<^B£SpV,'s,$Py1!ѕRHxR* /)gj&aQHx8|HxT!I$< Ooԗ'x + C>$,IxZ}HxhVBJ&m5Hx6 5Ge!3 O/ ^!-$dGj!Y뗄G'\!I)$< ӖLC($H +CP3* USV@x8XEQKJ`N/RSd~@x cY@xK) O{ƒɔAx5e jpf, <<"𴌩 <z? <&STTU@xJ2oDzt]EV;^Axߐ0V(LowO"Na"/+1 +N+Y9]g݋Yl.:#6N@/ GL/WtVOǎk'vۧ,v;~% +X˻ٝ`:HC5z҂hx?,oDd2N;Aex{ +0N{+Nb`7رQ-Cp;Ͱ^8NI;E Җu͍S*L:}syQu"\UoCZ-(n,>}wV٦Gb 6 /u6CuDJkmġk3[M[NЂVE9Sj}wN+DzB<6'tGIJ([ayͤRw &̛tʭ+z8S1#6N0P+Yl?0:-z;bNcOE0t71h9IhЩi)SMB5sA״n~ۻt s;h&С5%z6N<=6Nߝ@״?w&MMXt"\oZÆ L+E??FpPx@;uݒ0rˬlޤ%26gvI^rN->'x -98͟86:Y4:;g6 JΊk5$]q&\S;t!TQG7D՝p1@w}?w}oVr 'G)9\}}g$V_\FB7/Ѫ\ob W90@l'+Pɀ,iLk:Ó\>̤C +e=yVBPCCp#`́4h,+\9%r*ۇ>+G(a\OIž͕VIw}qs<\91@gvgqFh,on,k`QȄqFz﹇c|w&`o+,z6vXWI :{I_o,VYnAӶaa8طÚqB5 qbߥU\Ngym`M\XD13b][`dV,ULŁqr[5^כfds嶒r[ OݺF ql%.uyKpJ~+Pms:RV [s]e7GI>fwNQne HarXUcٙ}rߔSr|,gӀ>aEĊ9Lզ0r(E_Jd92sLAӫªh嶒rIu\g㭝Y )# .6,rZ_̳,3&sj8uڇg{νcAEJdO,jdp+ 5hYٌYQ|Z&FAk \m;je5j2+rJ+/ +Z=xb%L9 M᥺ЉrT%IfL.}ڡ5NkilIvzAh)q^^nRv^V8<n}YW ;>+gIa}q]8A4qy+[8>j55/zܫA[B-1q)L5Uk1-Y?oyrdV"H kZŮJ|ǎ>mC䒒 r[ \:ܶ r֞ +C}0q "'er2D +"׆ȡ98pF*Dn8%YdV"gnvc!r + +)9Y!Ⓐ^_\Yj獁S䶒)r[5\ryDVRi0ԇPqP=~ҊjI)r(YI4qS"ה$<(rj V2EnAK14,<\ktfTMU:4-a3'UL AhxrU #>NuO9Eom9mH9l9\ȡYF9l '~29}5?rMi:2iJm5rM&oY`ףF NG z%|ggq}LnO,t˫okVg}=. +Qظ-$jɼ72 +1Ny֞ Syqܛw]@*8=j4c\* ctb]_ckޝIl 4đg֚ɺynd:ܟ&dW6Zl8 sm4noN[43zkvy72!p[\Nd .BvaNy7.MYeeefX8EN'*N;wo,6;kd;X-`8-mDᶒp[u0U>E\M| V}d5g`o8:K0\Ypmzq8NBvzo/ - OKá2=pվJvj\d8)u_ .}V2"C:NAT ;J#D۵psh^Vb+r@{9!)^C`rp8߷,Mq +7 B:y`U๠T0*pz3Dd8vm2 +{f2ם@Q}8y:kV4/4'a5D{LeDW*spauYb GMŅCﳹpx*cu.up,>pE}mpKZX8n~c[? ၅AD`02үT82+,*N$BSTc9ԅy +'*E#ѦxQf""S(`%T8+57 * qm*\! '~3XFus6z+ɹp 1~{P8)Wi 9 (mYr&p=C_݁4ࠌ֬8 aZP8{Z;y;E~\P8طZP8 D|)}@4STp \5zN#K~}J6奰AyoBL +5I.p,{//>/U@dpc3(^ڑpD8 @]i(ߊa4GlLBm*h'ucpPCTuYAp29pm4`OESv0F8&8;V8@)뤬F)n2o- Uo #f-oH.Fko +@Lz3BlmP(8Ey:>ot:7NWd\%G'\>yrt\S֔e"<̪}{_߀g*4Toz ت9ZoTҝ/~{W4.ժ +Po2(o)MXfۻF|ӿ[aۅK߸<@寮'1A{S|,MM0z<&ܸ6m~S0o檠?tFu^]Di6#ፍ?ɷ 6 YwӻH}UY2)8:q#&m v`7܌ws$X7 ϳn:[P7^nbBt-RMyZ +MEtS9߹n*vdrrb8lc%lM `58,5}CHM &=y uSir\S=W.HtbH7IM/5'JN^$87Rin +0pVٺ*6?Pn(DڼC~m*7o-eyQ9A`ܞBq3Bk'nC[}/p_,L&XpN &(wTܳL6ZН)ӽ-sV`۔"mJvm#ϓ6i)Bҋvw۲.l-΍mkԶpڦQ`-3^ȶRA۬S+ l;qg5tl<v*kgF.: +W̨6Zn먼|xM<9m ӦyiT92# &`iBٲQgWw}ٔ:h6J}ﻒٴ4`65FT [U:rXl- + piPQg- FүYYb&+Ś2A7YiJ\fr*z UbI(XlYXl,b#K<M2}q&CKCjؚ ˹My@2l!h˥4e]VnۖWYO2n튱 +B\LG`IF$EDsleBXsVcq闈)n@0sؔKiG~f[#j9F03+06 [5@c?Oj2 ߠ468pT<t? +)T7eD&`q 3 'ib5ګ9M(,Gvz`fi?" Yl d[#fLڋ֨˥'abf˄,j,jb +AvfLOy觉gckʽ ~;FNɋg5 m)syņ%XlRbbbko[. ^Rbñi㷳րϻبx$,6H:pCx,,6 V,6;ntLi6e;Yl-hY_sۖhXW 6.>+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3W)LG±I7Pب#ql)=-]٬i"uk{l$d#\6#ҲmZBigk@i @6~CJ{!4/d7fAdk[:w"[ O7')!ka@dӚj-ɦMυdLdp]>D-xRcSB@̿3#WOvϡh; DNE5vG)XTdb: E f\^tLИ/ :Mf&qAۻ 48OѵUc2)Bb븚OK`mA +|5+LbEEb#T7/#͕bfr:9QmPq elBj}Nfd,6[=!^(6[gOQlII쯭.ŦGa=GѲ@xB!x  bNw+ +?b&Śq'uB bKwNU66%6Z'aJK 5O6(d6V؅*aC-6a:ÆX8l0% +^6=JæHw֬U8l\ ޱJq(X44@Y.G/y_b#fg5>2wL؊[ 6gF&b|AlWI% 6WZCSxWvX߶a"T,r +MM7lS 6 +׬_ب5#AlĆr8bN*g3DF),ݕHw +-ΧEy:jE2~6ySPؤ4 +Y6c&  g 4g [p%L $cX䍌kkXM%j/- *&naؤ)3a(bgk6E q_F@q`غ[aMgacD6yC-!Cضz ` Z{"l4R"Ƕ?P'ض69kl'j`2 o{P +Z6)3a&u^ig6:ZJuZ7 { [Rc`ӟ<بZF +hl[:w3uDK`Lg\1 8/3}jP/p 6YaW`c{0ldE65 8R/ +[lFD`P݈1rĦe+=ݤY8lSMa;]@oUl`c&^A[lN}XjLg>C9cƯoע)m|+̕6p/1<58PxM;wM85XiUkZ7I8a_ hF)"LJ !%ĵ +p $7/׌36vv_5Ik(8ky;֞ip;~lgYpVcϏdvZkXsid}vglڤoƫidWj՞; ++F+a2^8;TGvℴ{i]BYs!*BvfіiȻ+@>qiho:LPci?gfu^~16 ͔+; 0ީkP" | Fz!M&iZ=zbiemfwM;& ayM4' @ZQ(C#*sf,Ws@ +' >|4mSg&Z-)fuo>FOG3c<2܅GSh^GlGt4$zyѤ$hcG +)}&o92M&e> +< /f<7Ɖ́r]LTj 2($3mt,|FGp"dU'Yy)ՀicFeQh{>+ӵvx$>Ve8G7H4D䐴6: iSiҬF i(mFaHӧ[F3!iݳ;?3 FV2#mH?07$Md,&wA2B8,Fbs"3pk0҈bF}V2#T5H,iMԛfFTk4)i2#MwsH +-`E:nmAt+$!iþdi-BgM5y +!闖80O;!m Ux( 8_#Guͤp.&iNDa5 Ɖ,iRD)DH3uM>#fЉ&uz*޾iTC̄43-iZtz"i ˄4gM?>gXhiԩY84i[Ɉ:" .@7/BbXVXh4:gBgys3"V i>K1*VDHK,̚feޡc BY7eB*LH`1 +!mHͪ!Suۿ hP /5{Ԝʼ8(]}*5N6NMm)_ILʦ.L{;C!:6Mo4y6o뫇*Fjt464r>u8\6ğ"!V۾$*;9lRSY(vL93RjS%L֭78_SRg\6ޣHa^Jg &vKZP}25/i h *T%Vy!G[Pnp(YQ[~!ԙ&a W OVblb>V9m?,A ++ +RZ5cb*3)kCyHTL\tm֠%V D[RoM0Z0hYMNVv2-)?LGo?Ҍ3#=(:]8M:zhno월gC۶6/K*E]?Işa q\?:,o+mInU 6XT:euZ}?] 9y>%.6.~$;tEjj93GHařfDۤFq ,̯گBMģR1JK{SdbEGKB$ޚ}8Rae(gYo2չy:ʠ $J@+x)cC6oӂ؇j9m:n*ɡ ,~!u_[ooko# [DzOR^~YKjiJ3ߖ/0_C̏7J9R[Q7mU@m|fP3ind)qeO}BM2?Vq7) +OR8HY6D&P2Х(>y`1Q?hjw$Rٳrέؙ|F˦#j$uZtu4Kyp1Qb[yRΏ7_xX6_ZŇ-Ce{!>dzV`}>~4lVf 9|Uơ括"g$pUSCz:g74)E/^IamܦDԀ_I),a\cNs/vo.XlLWou&MNmʹ$$Uok*0]zRr[͍od뢟MsXYQID۶PRY[pMD1BXw(b }YkCmchp&CKn;CN>G ut":g^͎YJ~K%l$KT7UN7TM|},:q)ؓ[N067H+}G@EJǹ?]& nmVa4qL_>4~luk~,ڬJ!\rv& ,=[ +h'l1ݤWIYXɨ=n>Pd',Rdx_mfgNmWJ(̦tůd_ja-M/l([UvK֥0ӭtzs~GunW*]Aߖ:<̩:|፲"c2vK`v{˝N؇x"ŭrg?ϲ1a8}})X/V݀9ZS^1Ҡ̓%HnwVhok)kI"TY6'&c4q2 +]'4'̛ +WLT-Mg,䚭>m9cGEVڊ}*~F"iq"p_{08u%KͫZ(PΎ@c$,tD8┏8E¥F8su sYorb|UZL{mvi==E?TU,;V|Ps \*vg)n y +t?>T |(&XLfcwIRtn*>3zZdN![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oVBJhݴ0pOMtk\r2[^ҕ¬ۂDͥˋ5S/ ̄}kzxD ] +bmuɴ!bHKjD2%~4,&T1)/ż=B/mK@MXTO~3*lۆ)oT%Lq_rqje1(J@?Ek**xxfM&xÖ?Q@|/RY "쓨$ E,.iƾ|ǜ urO0>d8ߏrBm."^V8,M:hLF:BZ&,ξqwS%ӎ͛9 +gN}uY/۬e}(1J%f1}tW7؀uNv ꘯i\%r2JESǾ3(z*3O*I% \jMP~|WFq$ŬhRQ\n ;U,4c&bP)3zm4ZXz#izr׶`'iLgqtSŘoU.^E(ΰnxTRَg`QbX$=^ɡig{Iֲk863ڤ٭5:`ByHh?Y:10J2"  v&aUDlt١plk88]s֭Dm,p #4 +' ș*6UN?)fgt۳W.J{2~;E+yw`L9ZGhK? ە=d O[9"Xh1fbb q Iat]UE+}>fk^-< +E7,g j`~HJ㵥'0w>%E-,di)|+,vn=2.cDIQ +6)榣 Xg~/%jmxSmNp\~xsK3"M'}~3G8sNQ sT4uNL8`4{'Tv^ngHa=sL'z#n > Jc6JV|}-_cp Aʼn\v!zki&re}l0^F-=,7y㝗(кAu67av|5WLAȌWb6c?):TUjqg<:̬O`p8lM2A>A3ѱxz2}Ż +v+meY +ٚҾ6zM9C82SH*ʰħ}Q~BTʲku!4 ZEZE|Ӭg6tL\)iɡDh-líSRX!CPaB丕0XD3Fň>I̖8t_JfgJNaak{ˬO4CD_#ґMO3!+ wum&ـnNIiZDI0V-LEep*%5BkM~(wDψ=%_őz(i[3A{f>F7b(UV ȹQW2.lͬ.",4 F&1݁Et26%HGXam`(? QHaixԦG0=>꫗}Pd:*$fRg>Uc97ikÔ~(HCzԧT à"+?}j 0ŌWѳF&dY^v01s`*G]4?4c3CGmWZ_2HҬú )NiFg;$Ժ.ťú u$3=k:QNH?)3+S(aE s0 6nLq HGAGv:jzn٪e ֶZҖtu٨eq0螥$6 $dlz3]Jxh0yv[oրWR5vL5V UڑDRi:,ss{A0:,O +kHRaHjVjIh*Gy|1hQTӮUh6Ll?#Ib![jl9%7N,֝jA@d0o~,bRٿ3LagY;|x5@^f-N5S*,7 U{% +dTp/4I,X&veǬ 7=6( +HA}K I'=^ZELMO@4AآC^I} ZWiACn Jc_V.4vVc + |^=,(靌OJ`NT볦 ` ?i{4#ƃ`sp>mK;3x9I=|8Ihn\LM\<%k(I:ZM(;tw5 J; $~_Z`:G}xL%YP x3 +7!ϷD/p$G0'l5w]%QPvG; qS5cъ<H r9t( aN +{ B R +?loXWR=sIM˭ P f{+}n8vfE2\ ̡ i4Ql`Q£D{ +jCrVJ1tauhv +VKx{^v^(~ԧg%EqlNQZmϬG eԠmABK=Ro `3tf?]'_.#t +KX"'rV^fKl>VRt5Ǫ{Od㮬`!6K`VD:izuF_i;¿)-B>hBZl{dtZ=}fe>RvVdmg;ř̼n8sc`>[z`Z-x?/9Zs 6CUc4]L9xh*Yiͭ_Lql\ʡD׏q[ hb”SwܣE#16wORW PaM/J}%EϽ8t-"I,;ͮyX bDWOV)VUo(x g=>EqnעW )3Þ:F*Av1˞m*6N,dbVRAt)$>z(Gr㶔}++KUBWòϗモlVIsj(n}]"b_VkYD_Ͷ*a9:#ɛaks`qP@;&\ܙڭOw{mJCA3CR:lE6N+sT{^:ȴbP?A7N5+ЧMoMou9Ʀ{:SׇW1P:mxym^4煊Q;)j+VYXm9V- h566l +˺ +}YaE,Y|{;D@@?饔`2Α?uWo`9Yoimc|ODCv%Sg`^u)/Rr<f8oϻev;zvfEf*P`9M#Δ HȣHGJځwQ/ʙyu޹y+f)8ǞkZq$VhȢJIt2܈Bm͵.ʑUuc! kr5E2JO@^ywx{"2vC#:LXڀ;)\Ւ>Tsm sY{ 2s򧙐4zu#vJ"Xmmr#k-KoԾܱw!RlywSwMQ6GwV:lfN8łW02m""Ko\3 Cؽm(k*;XKjD'YX-ԬV;8PBh,E{pL{&Jn枏),6䠣{z餛iFؙy%=G= WK)ԙbE}|eG +Y)ꝏ'iaҲ_;RZq=Yk>fG;8xȧU,a.1qkտnYċ`[UT G^#87Q,v.lwG!YK=Qىgɭ_^1,\ʳw[Օ` +nRh*vf;1KqF{c`I^Z4m"s:+n Ql%4&a Zʓ ZZ42$TB'Q0=X֔ġV8s1݀0^V^.YΈ$#I':vLR" Yx]>LM*(Dt,DN훈w_D'u,}EēZxpqxf"j!⡐5 "57D5L D?ZLKJm5xM~U,֝H/"LӷD !xRxk4@<)'Vx o+TwW ^ M096o+,՘xkt|f5-3irJLOKJBm5x U])HE_Am%#H NA JBuJ2[AuH$XAu]$Ox_H6&7>?AIHA;tBIHUx +GUA+H<6/$;ij~F⡼xPxo$}lFW$R2oS"Dz#2xCɂ Fپx &o$pըHd$R67oA oRx[HOtSeQxh_H<:ƼxRxēZx +OVx Ϟo$[gKJa%CbW$7h)=_Hd$RoPÒx_H<=]EB$VH&qC24_!i&.D<x +OۨJJB]D!P!v o|/"9x#PӅP'"^'TE?HD.Q!i"!")g7Oj%"ʋ(D<)'EY)^"^z +"Jc"ID#D<*_D<xD3 {q}|񶒉xIu"kx Oq""UxOɂJS̟U"%ehDN")1VEēmMē& pBj"^?!iޮD^<e&qx +o,JXI8<)J/8<*O +OCPpxBCy8"+}+ַo:u 'Eᡲn  +pY0gÓ?|𴼭8@qx2X/Óh8: czs\a.<<.i<+@,<qx xP OJIx:2wIy:G2OJiu%,TQVpx T oDÓP3p7 ObIH4_4<a{^E\1JãEC4< 'Eãڤ}7 OU'|,nixGހMãeg᭦Aã^EcVhxZUixg4<dM5_hx!Eó$`_"8EãLQPhx#>)4q%8DϿix"7XeoVGyDI뛆 %* O7 dI*J4T7 ogyX`x0%;4/^Ί-(7>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAuGgP<Tql/T'ͤ:?{|mR#QYu _B5̎31l}_U'`뤺SC9*N-ڜ:zNÉ[:sQt[3,~OE`NB2.LGQI',;6pm4)e+ HfLs~f"T[H,%NI s`>IqTCTk -!SYR̠Ð+h%Rsx5vkMI6l[l-:,)Q5tm`-~| @'un{5{/+Im4H]oK[^ С`pNRiRʋ4ܧS0Ge9m,KNSvm @}x-k-0λ:ڽt_6M\:1M>B[{Vt{NN+w]5Pg{ak|(t쩯n$N`kwEC|-RY:1uOg{t?CqH8b YXZ)Ⱦ%##G t *N4Mw<d9DeL/Pu1ldR2rJk5O:N<9_@LjVl9!VRWa雜'FZӦ+3PmsYu N;<,,tR!A'0fw+ :=,dzJ#y"$TR=X.`Fը vɋAרR}tmt[ .]xDJ`+A`%;dYnGЭVAϱ h9A?*)1oAg͇BPJ$Q +6ַ v74:)6c*:E-'Swq: `̇~g@j:Y+@?y+/«:)[Ae+挠3_Aljt JVBibEQ 4ڪ(t[ +Ө{BqGNm]` Bd:Nݳmϣ9.rMF><#؛ue' +QvV씗RP~C-t Af!կ>A <+Nf5ck=ƦR.Q|Gh^:i6:_, &9 l>'aqI9 o4D9m|7򜾪] i;27vvΑ':TZsCSUs/r{t Sxqn6Djuۢ{6zisR8.ڜ˴9 6rMC*椲^9}[آ5\2O1yQ$r6Lj/\-vɴT>q|ZqI6g!uϋF;JmpsM'#2T)ZpsRo\SGw 1G،법BYY sjnj |%d. ؼ6[N< ZNyg C\,w@\9\s*Am *wNYfʉؼ<6Qnk#ݳ)q"đ1g%c5gȩh}C4uJŜ!BA-1r +D]Ɗg>W\ܴBMw&,R +@n0<u ]SjSiqj,3{)fcstj/_mt7Tߟ[ũT`˴WG% NJ&m r*ݷewV GUIB63rptE\Y rmF1rͺݛ 'Z!5/J iKu'%P!'&kL_wEq;1!'e>k d"\fkNS֖!πnor] 9E !0r +m3*nL!-J ZvCUd1I̤x. 92gCΜsW[ IWj=r9 +9CNU֗$~Yr&r"L8BN%G&IT9@N= GMCϽr(j 'R@#F7 +@Nq+#9?ův~? Tq2H?Nja) ^a:ͅT8 +> +c+kJ|T\( QN_S5 cz3?%T.~n~D^d|sJmpz{,9+=Nu(4z\{"`IT@І>9:؂Bٚvqv[ ,='oEx~\}Ek9-zSiǦTq fרv?? /Q p+E*gh-IP8󞦬. Z"q ^9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?Wf)ak`){0 [cw6o\^Qro?43M ^F8ESePi>,ӗh$77:2oO4o\2_ƾݗviX91ae 臡M~Fᠽl-ˋiNvɸ7b=zRZEztj,shzߘ7yyooLs02>!8ԩ@\ (wSbݔ먀77' AxS }evu۳.uwmxy1nqoYn$MFeTA׹nǰ⺩l;ǽTnjj[U:rnh[ V2b ElAۤX1Cۤph[)&Ū2M6ƿɱhm(m~Qm+shi♘m͂2[׵mR#$j[Ê6wM˦gIdQLV[6T.mr(4mXmw57 _,h^R mòiCmk\(] mC0j h?[+MmӸcѸɕfc~C;m-hYlcmK4,+6.0db*lҏϱmRDQ6ip~ mk8+M)m^62Lmp}oj5EʩmJ1,6K j'nעAtgL6e[6,jq?Rی!Ыm2^6MJ6a`fٺnJ[B)#{XM62mtY3mQmxFr!j^v6[u.jwd @wBa/#.?qOTiwfM3YM5HIN0PTmvU'MdgIl0ۤ6.6?J*lӘlVl` @id ʠÍWmZ$-e!޸6c&^&kS+[d7$*8l3.7xd[K_LGwij׆J?I[NLy!3*vlkcƽym(}U^k떼{6M۟i%^[(%kio:\mkaڀ1$69ڴ5?c?bٿgEmIms>m4ZL&bnR + IIml6zSJ=#Ѻ%R[U%Hm["Hm[F:M` 6]h+ʬ6WX)FLgm!ڒ܌Q=!֦3I/XNWLB˰6(VVÍPpf^`mz6wlGFV乏JkCmbÀ#łkB Z%.67"v6' )kg+=åm3:tvxkS`F^B[HmcXjLg>ƻ<N)v-LsnJ5̕ 6pM] $y"){$\]#g#lfl;6lnjI ͶLfCܺ\"l w:BkbeӌHwYۘ{CvAZ*3mu6xcN-`l!M2xAbcۜ7!9lZ9Ym%sضJǫi`¦z6Um\MW;`Qћ5U- Ҹ$FC6+{8 v{)((]k8wMǁ]Bb--1ks,5:SkG:J>Ik;B mAMs +ZӍ|P5 hm+f(Z}œPS5(SYEY;RYۛҦ^U3b-x6aMotM2vzgW;j?;"nQޟeڪ14[m EjwZ`5EC)\5};WwYjX6gl`Uj4މjsZϼT[BmqjtV"]45 `jg&:L Tyz,>8ߝOߪ#n;qV@~o+|Yj]g_#)n'5 ;R2Iy{i7. 5mYً$5U =gfu^~16I͔+; 0ުkP`XK _Ff~Rӿj,Vϟ^AjX*?@jfـ 5YR-&@8@jZ#FcB.vԊB:'Q$5T AjWdԴM{ 5)k ZRH 5]SK%H".{suѼą& ڜF#4 hdZ>9jR.+51wDwxpԔH[cB5_g5)QpԚQC`89y+)J|ЁQC"1j5f4Z:=9y:m|N?ՠicFe{}ɁcWpw OG-) )tZAf!Z&AS&XK SfcPZ05RO8`jZPҴ;pQzv~g0dVf`nɬ3LM$ jqY05ŢmǗaj^4aja^{ S3}MpRH0 +NLMpk05Rc&У9hj sMMhjþdXjK #23JV8eO<Jm ԈRKiOj`2JG8NIJM\ + KMfËƉ3K ' 3bX(LԨ '',-d3%pZ4bjV Pjr:Lcu"6ݏ +JtT/b +JMǙQj&iG4,Ptk:tԒXj[ 9Ro>_(5/Zl +IRC\,rF3JMa`kx(5JdRj,9"Mآ{3X(55„RCQj{xkXz/O@x+x]Iǿ??;~|tRLT4Wv KdP-ݱc<*>*}CDZGAIΎq#\q W~q#쬈bV=F=_RW_HO)y)@EkS;+ 筯'> +-/F}4iyyc#zd{-i Y:0-{՚8_߲9?Oi0{s~7u˖WGoBIGZj=@Þ}QWLJpa7JzlPkpQJt`^`$w((1;}o!f4/+9I oY=bH$N-yR2AR¨ 3~Q!jMxsԁJP~KlB@Oj/Ȋ!y@TP5h+ڭ y8$D߄p%!/],NA%j:5+/!jPY!R?丘 =pvd'& ̕!F%2!d9)OHČA! a 1Jȗ> Wn%CcP !U +8XJQ!OJ2j$"SpaWY>`![8#D&K&DҦD!3C?ma&D?HNחkz]z"9P^! !uṕ9I& DTocYtš@R֕ rY4 LIvPТ }6"xц;'K$_LeNkڮgSnB,r!{@1&* FO#Cn +m'\v.x$x$[;YXw+ӝTb.D"$RN4}rmCф,Me.V!zQ4H^δ.{cUË)T!WzE?DmWfw[ͩ)^8UVqwVRnWk(UW9d yڰݘn˶`l yu'M~tٶ}-vё0>UY\_Cg+A'n*LbdmLkYS(ۍ{9t2gڏ4ȍItJ^L,4+952d\+VLX_&`DPr:$8eL^z{߀lI`dS]ccgRJlKqnVboMTĿk mEظhAROBhY#*xb`[%f-'E߆*BڰQ7:ɾ؆qH"{%`h +ə6gֆg< ^&@)뭁"[^<:޵C0>?knr(禢(Nv-%$d#Ƹkk{pִsP+";!RJ>6Nk*J]jϻXkvHΈ]&Й`w(.ĺL#ZXAh=[=+T:65 +QLmĨτ=k1.&f7QQ8: )vev(2oΤ 0e8y6l1l3]gmR3XϘiR8Wyvqcp10QǕ+Yr>PH]mcw$]jf+Jdx۷,ܤ %4y`+ur\kp[^nenI@mЎuwh)_ +umE\Uյ})sKk,ZJ\7^u=Z5Q]r +9ZPXDIIeyR&B`S#Fg~{y֧Ahb/6Y_ +ig)V8܆҇f[ٞMMpg#%*\v +>fIu|ZAɏ쟊)}m!IM|mڬZFqoӢ8Ub7Rdd0s k )kmY՚B/JA~3U~`cFfF禷!eVϠ{bf&D!DِtѴEɇMD7,BE.\rTs35 7oJ(N`V76 |gcLDBoĤz,Mϖ` 8p#FYt<587jtf۞waE6Օ[%ީȠ~nO؎%Q*k:j2bQ f$q)ɱt!Ȏ0r#.4/h;gڭA7Blzjj 8]i{_L +MK|}V* eF\{kYkjCMߙf.064H12ńAp?igU"Y%[omêSړ|$vbnl +$~lwM f!6\TIu Vn +`Sc6e(LvO7N\"RN51;ש.&6H]QzmϠviIF.If5m#w1hRPǚ.u9٬@[9Q4v +&`8  '$ ΕQr"|}#:¨8I\ 9nof8d@ךwkՙH/;ⶄ s%Y[,= u/.i=nKHM߉4qhn<\Nuۡhkf۱m!͞[_VM*2RtAV?CWj(ůdyNYP {{W X!)1Q汁>yXeGq~;ku6qlm?IltNt}ʝB)}IU n0-ŤpY0뇺?] GV}yWd]&>q[D3 "1ôeƍga xUMej%#۷ؖv4άUT1jWp6kqhda[%ٮoJ +|b.97g~bڪ!ph} +1d)BL]T",(+c* +h%BYQ@CSH/6* ѵԢ.U]:fY. 4ښ3*sF@bRU |l}vj/h5 -4- +h 9Oiu;1O妴p: `T6s~o\hjc13k r#سI̢gmFU޹ۙ4g. Eͯթ@H:50#X.'y.,%S 6,ɍ< rИǢcb0j]GMPH(Q睳(I 1wԞ +slʬ֘q>*9(}(*m,Q̦AzeSxYL,V@kFQ8^l_c̽G3`ॻ +D6K%ҫpc hd-`­EIoKݭ hCz ~5yѬh-+*22 ]#d 4: d!Bv0 r71^t,BnzA1^"|McyѼ,` MR (uV*N߇laʬ!;wFl6Zy\b|n (M<^lib67dЀDM@1" +' Ava+9[PoEmD[A`۾سA 育PS^fFs%k f1'X˸\jBR,A M՛9GlC3N 0wQf|Y42o8H)FdiJ!j.0h;""JIpb67G'*ZD9Uow{ywU#'j`޾sk@])K0,iKzͱfV^텬}mYE`E= qknw6޼ܞ^ R]L14o;5gE5o $PԪPprXH˶;YR]mP 7Q0(Txx&ȣBdUY^r!A'n,6a\EBNMbUJ oCT[M#E +dsiNNg"ZQ̻:A: }=,h4c9h]e=kVZ&GAb0zZҍΣ^En=!l6^9UFk oźB&vP8A=hXo RF$`7P!jNb~FdԵ55v}b%BN9g$J6]S<:5̔1E'bRʲսn(oOgKћrB^Xsiob7!*;)Lw؋|'U'r!M [zk1s#'s,&a:ՙGg5gFF ^k +/?m2b?ul:M9]^ȤZ h\HU[++\qf )$zeJ*]&~C^\o'& jd`  ˦:ѫ dF!cg'S}hTsE`|CYDJgoەN9Pa]:ـxx cFNU"AhJIo ch?'=-r`\h%Y.MU轛ixow=kN+ÍVH=]ߞ “! [IBd\Ezx7xvh;X^\Nu:㣃t`!0,| *-8T٦ "q0v>i'di"[$Y+5V_Td=V7L7NA =bs}tw΂&oL >uַI4ߢLЗ<%ng&,^ErJECѻ5S}\Ҫ"j"HI*XG5Bz^`S'UhҐ%xSqä5y{yWY̏vu2q" iILn\_sK7ip vRAUx;Zq`~T7܋jqrX1X7\#ZI^BlnX6ecNNiTHhXEܶl:=qi f 7CY( NemA7 }{6+5҂@b$vGNj *DȦ7OM%vM 8*F\$^4eX&0UoH߇1.K>B\ÛX6o63HB@UF :. kw){1$TDCܸzhJT3-4śHÐՌWD}(- qO[@THLiތдVvKܫaDؤ`AgѰ`Y$9HA2wM9xGԗZ#p%l[nQ-L:AT6u;A8ƖL=h3ki$cm@ o`BL7jHvgKj M;ށ "R< WZ0M.7gvm4|Yk \Hmu޸ɗìr@E4#[gGLդJl,7 kqIΌ$vkߊ-EbjF2pFs ?})V(-|'[~k hTwJd3 /QQ7ΕRTMIjmw`a<~ +A5egLWGE@-%a ohaonh,җõlri8k`>XrX L<<@  s]c XIc6t΀ɾ1~7Q߶":n,lʃx8&WE U!03)޹h-{%~BTEm!p!kf8vr9}3y1K6ۦt"! (Y7̾܌+Kâէ@_dZ茗(\gdbPnZn$o1;RqD81d׵w&@ ;Ɍ1ɊWe`e͏ybK/dVoXbː5@CKL6e 17LI^`&ضxH!@ǜUns.0njAJlWY OyrqF^ ᓃqginjߕn.*:6,B4=\Wf h.34^T9;r`K,#mv[FK΂;S'[hAẳuVSoEy Yo-jJBsjh$Z !=OǨ4Aޝ &(]fH؈mwo).e:kչVsӧ4f}vP|m;hQ{ ="4n9[G `A[~"FV>^Lsj\+t8I˲`j5'ԉ`=ivNjq`+wn&4*c0LHw6r"`E9k$!zKMMUGԢe[(Zmb# و}DZրk&cB=BR\^mn]M"B1⬚ h)0X<[%C91x;3Lw@g7ɩ5jZʼn~sciXXE8VY +yj4)#-YgZ|KTkٖ?oyX8*TS0m#k-C]WZ3}m1x?l՞-[#7H%ChQ:К> r(TM$}{?7W"ȑ,- +.F0&X7Ab4dlI,nlLyiv6C+I2 JWx!:-ofl`md;ChEBwY>5T }{{^rmY øyphL%(j|4͛iQe,Z$@x[O`)x dZ?CY";vS|-e+e1zZ%}g RMBY[VON[ط.+٩'DMGgLHūF u$2,Wvf1A%zo=Ij#[6Qj>2$(<5ƽ FR5I S@(,[Ebo}l*ڂX ̟J}V$}s hi>@_Sd+e{#hU 6/5sFǺ}j冸WvYvZp?Iwf,1:4l흅Q*6LT2r#zDs`١ݳȚPl%)l,$ *I0xh . X:Ud g7709[>!şb5At0V/r|/|\Jv(Q/(rӂ5V.x`y?7Nerkm!м#ߵoY1fhҪ"t|Y;K4XvlkS%00'Ж*깷zbHz溚i5̮GBYegܕ)CIO .8co%\+gi!g-,7U!+zJcaS:9Z*sFq[[%g1\>a1uMkVinqO3oas|DUP/}͗`XYW:I87r^fͦN(˪#'n!gs +3&ieUc'k5TT:_߈޷^pnlqL/iSB4?%7ƻۉ},_q^ʵ$~v +zuLq%_TS\s=wſ/UJuǿ??;~G|tܡ_p.8T.NƜikcw>ByaHWU*iQ44R$oUl8jWWYG_cȳ/wϏ>TL񵘉@|`A +F*Կ:քɫ46# +:(QDA[mu$`Jn[]l.Wv[ t2ƪC4y4vL=t2. q7ku$|Jn=[h1w +"JWGC?ʶ妱ꂨ.? ,p!կ;[J { $spbWd쥞ώT{Uaad + +DVl+kXYݭv=u0ώsٿ8 +y-%N2܂06bKĪTXa4nhB^7"Q |*9򱘅ݝh-,8̆P!LGِ244|FM+JPeuPn߭)Dݟ>92-:ooj3Gl?/_]_]_>^]n<88 w_~z7_Ms>'W}uۻWoݿ(>xV_hWۇ\]^m:=byxMś<\o$l9go=û{{Nj6g+O>/s{çr}Wybm:7oo6?M$;~Dr^eCq2W}ˍ}Gr_-t}YD7o;?E?lڅ_'pFt0wu{b|pQ?_yaFN7ޠ`l ޑl lـ[h_lRmFvgW]|ūH,~)JÛWB{NU{͛닻;]T7fWW!7bsmʮ ׯ\=g#G~cͷWoo.<^m4!<(o>`O> ^?߼Z*qO?7yˋmFAX=Ijl:!\sq[m,[:I6Wyz0vu2:ۜoSvE&l|Z=d=[E$l> |E\|9׋ _<\?~s{ZOsV`WN=[gZ_=|}?hۭxX<QxH;`bqvwtvlW:w{N7gxuv)[ۆ뛋CdnDl(87 A?jz77_o|xALvu@ƋQa%WK6W2ƠCW?r2m<}9jß7}sqwwu6vŧoA._|A6ۥ\DzX9/:罍j`3$N]]l^syqsS$&/<*}7d\]nqD9*]$`3;f]8#6.y\[p؎SE u~\8#ڗ9gy9 +o3/88:gvZzZg^._pfk˱[Eg._pfCDb)!ϴ{\p @a1^O׏Ë)|W⅁X7w2IY '=<|ƃ?ȷ|;ȷo~vo.ޮvnKvnvn/MMF_naBn(ܽ6(;oDM4M@@Nxz$?nts/KRH8ğ?vlAϣ~?`wK&"оd+s]n;1Cs~ׯ߾:z漶xə_W77o:Λ믿y?Dҍ9mw#9?ߪz;OYl,>vc[}iE⎟Ǻ_ک^;.m{jp\'_?\]}R˫Ow']\=~pH/k.{Zy~uM9TgJ̔sՊol~o.7j3ێj0gWc/'~)޲+98sΜ398sΜtF9١Om[gs/ C_Xn +/,x?PW8صxyy9ˮϱ-qOћ?]\/v8B=T:Ͼ";~n+s0ؗPEUzYU>ۇS}7?;O/p% vKAd}I4EXll|.齲B7WW&ȑ[/Xؕyq#6_m"ӧ67W`O>7 +sیds9q({}p쩥0i#9?B7)pp$c0/@>L6^?\\>^zs<ؗx\?bᮧoWw׳?1+~E'׏qO} +x/7[ p坧f#:>_:_z +Wھ_p0Az\ +c]aC]5,ޤ)$}M=fոˇ=+n8##m yx2a ۋn7 O?}^&6Vڗ=0mbϣ5RG~ ް8Ky{|uRͳ;^޾m1oHыO68&.[(}+<}ƚۇWۍmc^}9nօ6.tuS =ygX\-B'fZqMP'+ z`ϮZ[ mG~{w_<EX+B|讈ۃoAyɔUDBn < zoR0xϓO~@Sng:ypb:~sHԽx~j 4$.9pn.v\8";~n+s08/WR֌~r?KcV@z̿ھ;ӦWNK?|wǝwO{߃moo_ܥowQp@5EEyTgP]R9"Oz1SIk95]g q)0{fu!6|mFo[j5wx}]:?^|o Ss+'T^߃~{`g7">{f +!ݛכv;! +Ϯ+q/y:7}.xʔ|`ЏÇ\aO/}]eR?6">'B-Oz;8/UW_?xZ}8ǷG)QWR{om|]Qwڹ*;M)C5Oc_!qC8BpRN}L$>wˠt9r|V8:Oibmp>2vi!#ߪw +!K?C >S8^8ԥ! X16pi5XvT;8:sshE(s)VJwꆾ2)9ԏJj;a~wj+u°u]WS؇E1&v\KPoj>K ˝Nu`pu:*)|l(]d]J(}!}K-W8D|+R)s$-WY.nPO])/ = +NO8Ѕ'br:%h央JrL[`@V}0fѺ.c,iȎ}UG_˼PrQ?^HOs{^]gBtRIJhpH>]QB%̵lʔ΅P~,xdwuUux]WQw[܃'c*R}+T`X_7S[`]8dUNYW>J0`XU!TbPf ߅0p/dJ`;l;_ru4U&O@n瞛r._a]1O`KLڬ!&c **]{ɪunuMص:X \wP)z: T+iu?jT)=;J-ouБ]C]NyUa2J<0}@)A(CɁcY_J{#|U'e$uc9~k?R(I1zծL@2n*dk+c?zpxT < )`21$!{xePg,bz.NrgQ߫d$.acCTI.Ʃs!BjaM]D9'sWy*1Kt`6̵; c ܮU?2?}uUQA?QaڢpE=eH +^?hFSF&U0r-kىEu p Nl%Wr|ZN8Ga JUK9A);:u{<; `Tʹ+]mSxp-:D:H|{=]9P¾VIu+IؚSN .qJUj2R EA/nwMzf<*!r8}C0Dq8kI:xٷ}^Ά1(ɚ;@ *ICARV>=v`0O:tP=̒BYh BG Mmת'ו %V + +➊}FE2zl؃hT:IrY kʭb(&LNvl,r>&4𥪜K~ +ct0j++z2B*  u/I{yC]:Ub$CGtk s{Y6X'KF[Cm>ҳK;JH=8u P%!UJ:9 jr]8hrj1 kKC\pJ?S`@13nڒ/8B:{h!Vk(pcIj`GڦvDSԨ𱉗nFg5JՌOP<%fC`:$*91 +x뙕6SLI/斮cr](tnTg^*-}`BoKLN={ݱn-lu<G;h{9Dxۋ~R >v$ Cc-GJFt_[?'OL==!y :UrZ'x] =^ `!'\x Ob>3ˣ5e|e%sydL#=AAFw6h:_x֗w }V箣I +SP4Y:u`: ++"[ZRpfq{$UhOD^s6shj4akvP9\:v7\DI5:I)@ G>閁)hx*hѲCGKa :(zPyם_#E<+Gӽ#@/t$8ҧ4|HUMi ڇ )垞2˂JQD4Z xai)2 8uj;yg{mڛ5uQ2(!yh^Z.i +&aKGKG'1mXW&䙪#_ 05Ĝ%2|;ZGpBELahÐMz02e_S:P{0wGkˀ,vy),*Q|Jӧ&@xxCsK\G /nu@M[. -¤ 5΃ˀ,Bx>j?4{ѓKsPVU3`PPlu rJ g-x\#w2qPN" 'ɩ;q Կ0 N袌sUVm.J8xCap1ڮG\*= Bja]g*J&E'P-'іŘrs|T#oDuK 8X†NFqA')ϏNbwkD7 駲K;0W1ni*gXE|2Р:.Ox$Վ!DOT9=@@]gJzhO⣔@x%&ߡ _ +20jm/s cX׸̫ Iˣ5J\2{e*)% +O2IJ ,T&kYy5`%``v'{fSTHf AƳz~lxP4_.Du?K'D=MȪhe W-o;ְb^( u` I(qy8V ltM!zb/1@HN@~wºGK)Oh),9dr.2w6ϱ2+3ݰUۨ4¬5$JC+YlI}sF(YŻ7ypȜ0iaFXZ(ROs[$&sޓHT)Kz0t2I7 + @LNMiD~JPVkeJ'Ġ|`脂`PggS#΅B˘`n1?'נᠹ9uBĊ]m)+Ee13GW:>02| h +[fKGOUH#I*`nvFEf$QR~:b)M! d)N=>Q`Q a%+!:KZ CN֊.mj0,"bΫAq2 @9RKap[3h@H5)T׉#'ZHrhż:}H.08ejS/OO V1M}؅+E ŏ1;X]&|>4HjpUyl ^&$8Q~w̖D(t{_Ў!<}]-h v9EAտ;d$Pe:{9ivM T]e)!.dUj:2 ",*,|yn\NBzbYu"rh\1~ +|S d]6~w +׃>P1XbJi:ptLMKI$cT5 {5FS%:bA]i>(syYGm3/$C=^hp8b\~q NxDo[<$Go`y|k Mvb Prqn<$(U%`F;**`$e3QnFǨwh$ni8DP\i|YO(\67!ijl A=:D|1 es! #" +<}A4xS. #0Xc*h2sI$n+N 2wx0aPC}h\UpgI8(. +#Q[0$d\I +tL<8pU搖e[VWvq4@. +*1}$r{uٌHg 2GxВDc&V?_P */ :Ct[Z+0ΏQNh֋)8MLpTJz3D)#pvPLT&Sb[R?C@@DQUEOIjS5v t d 2P>q~>o`>zV75h4R[Lr9M}(sq"A^L:ǀ> +9! gk|%|\B 5dLzi= Wbva*6|ԯq>yk|'Whզʻ9ڕ$r`WHXG%=k A))tN^8K/j79_ VŞrBBpMIj+/S"D-%F G`h^=2wDO={Z?_~p,L> +w f.)Pdڛ1"FXX1{;)2Ty>>wȘY +-QۻXϞ>2A2ڐsޞTݜRw>eτߒ{) + DSEs>Mًo2VT Ͼ+5'홱^T^S{w77oo.^뫕2 +Rn$5\Ѫʌ9]踃^~Sxr2dپ`Th?؟GYJZ43}UCeW_?\{nۣYhKg۸ޟE'w2YM0]>3] ^H8M@IpD1 s;U:Χg_H} MϾÉ.~a*U"/zϾ3wmo_G/zzWt.ֶ k zWMFN)5HXV~jAKxM(&J%F9'VclNgO`ϳ4|.ߩn)wGdKd~)&Uڱ~s4g:}G }RO +t6}rgl?5>˛F/)U'Ntgz1Y~1QG t|s9)ՊmY[skزH8Y9pmZ{yףԬ-@ }6ԬT^/o&fiYA2wpڐ6y1!:^6YƏ L8W3pJĉC›`oJi[iac6 9lMYM~T7NZy8OĞ &:Wnm8!J:'.ŝ4Q|WzZkc7lPUdM܁,:\A@S]̨pR-#=ZJ$\d3xP*p|!"2):kX5$-D/$}FR( ۳z NZX|:Z>%IE0e(z3=+E|pG-ٜ [ ! 8[3ˡNn¡X^vܥUD1m~2Z.{E3XpcE@S“$0c>YQ)'%]5`ѼApz-Y"|Т<&L/N +%I? \qQ<θ{bo.UݒW qCv8 >y>|{ toiݚ([xFE;heE +24Hj +9B]a0ε¢8rD*o*SR(?3[ B& AjvzT4NT:KZ^rkm} QUL"oa(J=QIa'QCk*M +vSa::PEF@%Rqkl!e(5$%=iuDftY(--a(ɽ][.,mAډG 'jTO*I?3W^wQrR7?I %ŎI U&BZo$4ʍ  ^ꃗ:k,, $8x[Z>Ɍ< a*q0A>͈f*$`'u8'IzI.&!u5)RrN i^ +8޶*qM(ӈ⼘X8 +rhȱ#El*$,%R)LapCt['X7EN C%Rxc$KTX1kJ%K\*ݱYVu,Hh<6d9.)%ۊYjI}_l^D|$@yk+9&zo@N.E5W8 Iմ%q.x*/&dz" I𫗴A,d񠥞lEnFu^'㸪8Id sC-"|=bqBxw*$Y敖`vإ`:$җ$#0B$9 'TNhq'OCdNTZtnY!˜6- D +>Cǚx~*\\VgID$;v{,0;0#fp U +rGR %9Ydzb.R;E &kH +tWrUR3f 2wg6t3ISghO Lga߮@ L^'/bLAR rŎqHJzY^2Ar!cJ]L`DztSQ+^y$M`-ۍdp(ra0a,p% *Ift<N*YPLeڢTgbZo{R>.XU^Y5jnDKbhJ2E,IpR/fu`E`]*C )J- h&"y{-8TL*uSbCUDC]A(^HFԬ@Y_7WEb"y^.!9,-18JI.oS0bgAEwf \[F(쒄m4Y`hQ +)0,w)+r(wVOjY1ڎ|!ʝ`DhFϳ>9sñ +BN60 E+KIYifIձԋFեUɪVpNQh{UH: \g<5e%Q^H")<_y/uYԠ2\bN7O5,Ayb Lυ^W +jw37EǍYѐyiމ.z“lїfDfA/Pp&PRS #T0;۱h7@/ 0,Ɠ?N HF:޲NW:]u]/"6KA։nmKSElS1./ q t7\y=VKU\w\PFf .U49w. !3\z.)?|o )]]{'O &AP0gw\p*F :DWtw\B^`[+.~=@w+Crr6 +Ft%^'HF.@ui(p9IK %uLжP_pie(T~^ڑ +U4mKm.ء_pE@wǮqWHdz vˈ!U.sWC ] .OE-0j0F#ߕR;<:2&..ŕaƁܑkc7Y` a r7\(py`n pV~*a!*iD ϸ1bQ-GWS]oʙm@+.+ImLe 1``Xe 7OjA"_4UeMN(:!LrOCw IgH>v"ѩ|LCIN8U5xPcd.܈bQa'!Aث'V9!;%*s2 S@i @j)P@hc,*`1 +NYPD섮[2[86@q[qr< +ޓEI( eFQyC-銐N3HWG۱vg8;26ԅ0?瓵v%p<8 +nʍώL@V>+j2lbH#Ki 逴Ec\wЈDaTUHf'TB_` )j +&&:jOpZ偉JyOOE\0b9c"e灞ބY`QVɩrdYŧ +*gl?=Nر#@4#nNLEjgO * 3|S;ȷ&|dm+O=5Hhzb m]@1]>DJНq:l6DJ$rڻA[[ˬ.1!<=X)(N: R R2 +Δq L ș$, 5ѠU\"nr\+,|^ /v^T Saʊ#ꢅE$],;ho܃d^}0{!9CULH*5 "AB0M 7<ȄrU m%>Qh0)2e +2]%j4֝NOx@Jl搢nHeJ4(SXD'^Q+XZ@)1=ȋP9%[رmD* j4At:KȜ\v x7#1ÝIHIWːj +np̲;Qޔ*rŞ_B]'$#!bCp{Ix%]2f̭.Q9q=#w9Gc} <5>!S$z]EeoDyGI 0{ |o=&Y&A5(}e Q1 +Ex{/· +\f4pEiFWdHS\f$pE1+i- \fL4#+ҌH3&pEz4B+2v+i8(-u:5ܥhyK=j㿤lRg RwFVk'* +( +@ah0)gN"Td N5oy / WԚQfcn8-uҗP uCN uQX ] u r-_,ܵø3sxXE Q~N Dܜ%N  Abo>DED񖺡J4`l3 [xC=:Cb첝#bەzIo9j$4ĕ"#.x##{{ +qdV(gw"swvX{c=g7TNHl|DY zL@F@lpFϝڦ;Zv6zCy;b F(AiB.JbxgٔP橞XByݸluQHLBTJB3Brq"mTX ģ\]̫Wi&03f#u18G=Xę(H388%tE蓁q(Xp]9}Fa'* Dqcl"(3W }鈱; ?ࢱ!@bC60>Q2̛XLQԠp8.Cf8j0] hBFQ[.d5( QYpޅQoB&Ζ(b4HɳDɒ(%xz N ƅ4^TSĩtVE fD +%iR0Ąэ$+X键+"DԒ@9 +ʇN`)Ҭ`ζnrG!E$偁 !ƨ瞐 nr\2( od GŇ Yn:;#% +8d0rp +2* +Y%G +nUz 5j4Ӫe!VW5~lxK 4(qb5`ɻXx(h09Ad3ݥP)Xk涏ro\GGNOKFC5<`t& $W ZAו$fP5FH*hArb@vF`uAgNn#<0Fm4\DsW#)9!irݭErݽE"^疉n#D<>RaєJb !"; چpL4Dɜ$`Rtr#`|A׃GnAIЩ}̆` |>YE@8KR|%J|D5k&rUJsTX]ŕs$@n@6OZPw[\ PA@Jzp!QGr9o;hc%Ռ wt&-9T52a  fq~_<;*cXʏ$"G 7ty_HH*Un_C~J!ĺ;#CHj@o DfyduHU|S Y@3G~T;X%~1=x1\FD%_FUAern +OqWyn4UTUB`;گ&e_׏!$&w6 f r=[[Ay(01%mt^ 2r z0E#yUAA2AGJ"f#mCbHb>̧fJX^PVl)"aN{C|Կ/C2DxM  +VI,χ^2$ŃFsRҁ:K%D}Vm?鑬94R7@ğׁx4Im"3!-S(_ >F $ .+CgҶ LT܀2rP`2ȩHXR`1|(܇e1ԟ>|`G7!H˧@p~I';#Yk1h'0wlXwDdzM1ƴ +aFIdފߔ&q7RL p)Z D + 2N*p1︣ .tД1M)nalkBS~ G%@,(CWF!k峉ckQyBPʥM BzlBL1T;Q챤+HLP؂ +a(:@֊zr벨?enRި(Ixo_`¸`H*[T({jj9sE#@IL9^ĚR"Pqt|*BեPEtL}%9L3 )v2Vj:B5&$1J25%,!aXj4Jp A&yEkd|jMq~?\i@ 2aczP|ܚi\ EUP*;1QE}yyڦIofiv{g~uhl{^g]k1:?{a4ŨC{wm MSUcz%4ݥ1wqbːvF~N5cl?Nmuc +W^Gg} r#o-gMe QcSmyjNd&#!/#so^@>xr8 Y(wy +|&,LrA<!fS |rEBK2uOCp:,Pc'1J)9ɋβq @h&)֍Ԅ75s_$[j% P}AdB|JK!LsN*WUk^ii۽2T@"d, +H3b0:vEo(d1 ҍp2%TeWJ>bߌ B$qHP:52?TXJ>Ϝ%T?|9$*(+Q[䪶̎jT)zIEϺ5΄q`Rs:x x..aw7 +_Q9}$^ly-,` @'D[<1eFe *Q!R* L #jẘ9  N!8&O5?>VQA$|)P"ކt"%3Qa4K`ŚrzZ;j@NV@$=~ A BB(ACհ)oVƄ7(,!-)H % oUDڕf@dLlYR`ǀqO@l@" >ey730I4P@tZIjhFrx:xttl?&sEH,g%ozXt!mj-d2ʿq TM`kScy +&J =!| xD!Ȗ+ "eLA; n%1d ^ҋd,aPP)}̆)Q9FlT(=Ln% ŏ-VoA3S0R", 2pT '/m[vTMWQjV*.rX@DUVlEcD*PeԤ.*G Τ!]H92 )@EoDNI"i ]Gu[@֭N<hV\)-r3[KJm +իY% 3RA*W[kh`'Qҗ×/ Ē"$K/)- p%0Ca-eC*G"fƋq|T:$p!\%[ gEaA*sH&@%kp Q1G{r"Çr+HJ\nJ`%ş?aĮ)rKg9YQɆIJ[n\͌ حlY%4Rb9aF.JQUEPpyθ 0)4*WAh BOhF/*r @G׭bE'3{H Uqޅ6\Rrtoi~YJhOd qۊ F*WۈqWNX&ɫMN-VQB}xeXA]I0J0X5OzG \H$сZ$hYTTGBdY΃K;eyB9Gvi}=:EjpLIHWީSD_/%Ul[ +Ɍp)|W H@p924KprZ9I(0Q(~G%#WL X==1 +BU\(.Z*ǃՏ3 +KbA<7\L/wJcZIn7f Ӵ$M fDF̘8*:vB`뛦^''|ߏE<_ G Jh&(;!?(KKr&Xl/E/.jtyBLSĠx$'bph(>эDl Q-r\R0&25"Gn*w(fxfR6C<@\A@[ܓ)Zu \ #\w| 8 "}H砻r /$+Pm ŵ*)( +p=}Ylm>6`{ +4jIEw rQh۽QHYPzbL"c"7АAGYtYr.\%ݜR *^)P! {&`I[KT8A/*7SpBԞ4lD")k) ;u$t+Zh./s wKXšKv)] [+{2DHZ,ckTZ@J/ \Q"Hr +t`zĢ!7D)3/N|7&=P9Д;tᘆHԡ*!$gPODQ>\;+Ӵx ]cQHrQ +@ +d^ȆS j\A/rHEȌn ЍwsY +xW q)1\Tj6N /a\Hc14HzSUD1Zi_螔QzJ0HnBD_t #rŢQ@nu=0MA C:$  C׷"(𦴁~YPBBe9 + (ZN],Ez$!c:,N&CBG xJ +3`DJt"ۂ~Y^[!2RndAn z?Z"aFVd? +9y|}t{Tq=hT+5?i$ǰ701#XA(O3.zw*Tӂ& DInA 1WivHI*;:Xp׵9S5- zsWTAmf7X3)psQaZQeFEyӴ<w [6@}=^]%)LRKb"pb 2(˄LnK۹ +!`>vYYKOy0U=LB)3l\  U?i2\![s#1ΐ{n.-1W/-Sڃ1Y;Iw18hGVwAjC.[xFQ<’Hf e8 +tOxxU IowvҳƠSO/%esb}ɮ`jzqj,Onso<3֠?.7;~y|[vi 85ÆϏiNM_U<9=]o]Lhi]{KOvvAkvmOheإqǽcׄidN-ߚiF[H+l-A8+1Y dFX|qon_1i[񄊏kk%P]IL+(dBO_ZyjŁfR8~Շ DZkWY?hPVT91oaoϱޯI8k@٘ovGF>pL7] /1#M &̠teƭYoi34wܿVla;['?\Nbwڤ 6 Wo f%xxmGk[&p.@~ds}b}77_fr^Bs?kʃ;Cr0ʧpQ8Ch8괏Ũlqh< Jku;nl4w{ߛd7ᅧM(xnϝp>iXA 97-XjVІytww]9^9sɠ`rrฉJ8%n8)Z_v:dڿdvI|JrN@F m +gn72ir7;U>DO:xݗLV -4xn]EvˏkM">Yow>VE?{̲_Xz\g/'uZOG!ތ4 wz9=1b>qC5j+0ixAL:o!AAxG.N$$e!ɀou'!`ߜ|PcJָ!h_͉T?]3ACщ +(HcTox Ϳq?y}봛6\b~ϗ!u4j=gAJA Pj&8_,%ΰZn @U u}Ex`raܿLQ=)/`u6w{'zw΢q^M֓X]6rwo^͞wO3, 0>H(aZ90nN%,]kyX!XM*׺(u߽zw/m ~'ߩiI ; mt"v>:xvuwivqraLK IIlamk6.%Ty jUbENSA\T>3Waw;ٍ,2M6%d +%!O=*$+-`9"®A (R-?~Se)83*čqsMC%E +|-A9 ͌rb,߶#= UxdtUt~Yj(8@,,+S䌫@A/onvz*,iڱ,CUnvK LeC%-'Pvd*uPQf2 -`z5sm%@錺{@2> ])S[-ᙔ 5WPji HTDXjtrvb +VY0S2EZt-'* ˡp3L&8B[JȒ!sIH 329ȱ,$i=es*}g-obI)-}Avsæ=p{=)fA$kKtKHFP@)~EL)E y&VoX4i;[qV-e +e҉ 3Jbt<7 +8]*]Wn+)1>ኻGTRXfG3Sd¶>}xs;,Mn(WK͑# jcUE8Τl$ +j 6T,^$佞ӁyqSҍ%x]Z dts`pEDCM&f&۱E! .+ Gr]Q*Us+2@ǘQVٚZ +3(m*n5 r\7<)R%Xp~rfr ] %\x% vT#snN52^X\qve]TUnMΙokbD\*fƋ90btb# k߳p3Z:T\D=bHxV4@CVTQ$D PfPYiVCcx.F|egX.-/ '|:\81RN8yt[Q*k-Ic(3++V5٣[%$}W@,HzHE bd+붭%r +jk*q&(%K)I ++TMNJa79GNRY 6*Y GQ-Hk"J(DV%EtM}PzԤ;M?hۖ +j3gͻ c"WitdOpt?]- +ZVVIBT2.)|auHE =fcKQA!b&p{(( +À?o$} :"}êPxhurw81ʪHe2EW 1ZG 9 {G,'vtxcЄ[[y؄7/bi(.Fڧ.f>s?˂Mip朱YkϮGiЊim,mx|Yyuy.OfvZ||Wd|i-?:5ذo R7^kQ4/yiMl,6nYl7mw;:i \\;l;͝y!u{r/^Z>qphG%{:}> ml_oSOϦwvaПc7zLU&yh\rȦLE '{ή%@ϵ=tNQIN݈<0jAz]8p[ViP՗|>XF,|߱ S;3D٠ͳ[;+'Ƕ=HR{w66Tw#9 g|t +1./JYe~G/_PQ:ZKlS?Fx +G;zBN?x-wս}MǮP1I(1ǵx9 +X?Mixy 2{=tB:{d[Zhۉc^'Ү>2ߖUc丅f=|s+JyqJ˵NQzC؄91lͲ^qvSב̪(g'M9g=Zp:6[͡ݍ}2SZnwTm[Hv"\6E⃵N5hyݰhz r.lǡkh:㦵^Q}l톳a bT ltAY֧}>2/쾋}5tۃK<s pP<hآ2%h!s02}s9[T_xK[ y;vҁ&yd5 <4yz*%9;w>d>zf'x4w@A쟍~kߞTm l/:B~ucMgivQAZ[ 8E|M)Nț*&yPS|-6]`/NXՍ '|gb*m6Uf25J|[xk=5ܱczW 4 jv:[ v7[C?h[:G/)=}x;k[ D{9wt8 zOoooRG|ZO-ˬPG.M7}.-o0RBg|y9=t=swNoY&lmã +9vcm(b*ORiuJr񙳣09Rۘ<-YX[ݟK7fpvz3QF]+՚l9› l5hw܌eGs|&BQ 4َUwsGsZ ۭBl@K/) +Rۺ;C]p.7ܳ-Ƕ:IM$>n)Po\_g};ǝϧ +&m3:tq~H&U I\Z \^3)[?{KG[q ӈ#IN?4xQ`lF`cB0fٳEaNghnd.dyn)AsG jNS u-UV:P]?};+)TuW'_nd\TdإI)qDoa#z +wBZk;kѹS-dD׍AXTttqnכ[_gY;U~Ύ(g/wz^M} U?zv|Q$ Gom}Oa_lM-{s2y=*)cXKmg.n.?xP%Q}zݵ[n_|}tvi~õ ק,sW7^ܻX߽N*liez_.ܺ~ˤrw=.>^o޺v>~^ԥlvgt#j|}WL,ήݹz]ݿ}'N .6Zz'!L@L~ZaGDU migqkӵG6W~^ʷ_m͙kw.|E;=O]Z(\ү-/ǯ]~mWRGeOԥnLtRܰϝ|psk(*k;mmY>\{UkmAvvJ߿6n!txd[P ݚu N꣹&}rGOYzģݵݣ7wvU]0rs6ênn\>' k}o~W۷ר+ŭǽ[kSn]V{t^=k힟T;]v41_~weݲWw5[wE->zٝp [mDd\xD<_[8sayneٮw~HV^ڹm=دvv𯋛]Xhٵ[f +kٿڥ[.-ufsW,ʻze++Ѫgw){$v駇P;\abr l򇏦݇O3~v >^>?}Z&FǫQrR" +φ(8\&,m;U(uEzAl1_Kd42ǞɟpA Z=ӏz,XU{Z&0^>-q8uޥ{ZbH79yvՅƅk/_wlH/V_L3QYR~Ū~3NoHt KeaV^+Q>w7_,n^[NY[.;L0h~[|: kWG b +ZXH(nxX|a:X4?.`h3iF;DlX"M:l=Z ڽ;ʽ7Ş5We&n]y_3RVݰ>[{q^^[3tRק+b\ܺ|xڹ*~pjWy:*yo]y]Y?\z` 'o.->{rmef!{rVlod돶\9ȷv__qνe};8h5o3{<-,# {,'a-1cA=ve77Vpћxp!Ov_n‹ ?X>v`p\=LՎKv5Xx,n29ɤtsd֋;N~AܟܹTuz{Q-;;UGqdxye[6\V~ztz? >=ߝ]ӡQ[Okev Z=^}sJk˯Om栯nr+^zzZT?^E+Rʅ~kܻpZqlݫK(o]Ǿ#-ikw:~D~q]_\y0|񲳾eݟW?f+{[+{SV,w;ĞKV?'/V5ПN7ܳ;ݗH!qt{RU|}Py#~ +:Y,fc[?66ݫfjdW٥Qgm~7 7+14nb[Saۿ6y;Uo-ŭXL^pnXaF'n~g[ rKnwv|)nwޭuZݞ{j4rϛk/^޴~OApu{ԥw[[/$rvTLĄݯO!ז?XqkVo3V[E|ҿ.E.e6ASif{}˫g.ܺsN7<%oWεRV^(Xc|!:rhMU(/oFn@}HqI}8Cpn)e}lvCM|NgZK3SNscJ|!}ytfq\m}M*?^T +@N} BQw3iֿoʟu@D5Mc/hkMq.S:J xwʴ~o[qcLYiLD96 +Kt~zye^`5&)K`<(\>ŃB KB<|IiL6 +]3I^۟f/d-8G >nRap6ql醴NF$aѼ}ULq{sH/Sp2<59/IE JB͟zpgT؛~]êՇJXMMTznL$ir;gSds!4";OzD’GqijWidyp'V& uGA=/ԟu*떎;R'9Mfq9٩en`Kܧ%Ă (VIVOǰۊHsxP\O<[K6> ?e2$;%OR1;GGǙng5s hG.8p걫m\׺/+>mFR*X)o4Sn2g\L6te~I~L$Ew1XI`|@9+n~+֟;J<y w`p|cBV߻O9}%j0n(UN?KX`Z޾|R坧O;g?I?k]sY敍m@k|zP?ȟ%Dqog?js Na1p>2v {X:DrZ'nkHX/#$#Qӥp𕫶=.0gF6,D_ĸxg}R+ H=49}G6wav7mspOZhe-壓mϱqq;V'{饫V-}jo|+Sda=>CcC_7Ij?`ViuXZ/߇wpPODz!v z.4?o94dVeiAfm&82 cϰrV=t8./с-S:څ;ߠXqύ;bVPnjyo\Rm-#<_0dp3zlsxv\ w8ΐVm(ܿ +j8YWh-''g?Ҡ((CB0#\zʰuc["~4`vL7r4hZY,sl2y +2GAv"?4RPmLٻqPj]h `/+܊bq }br!U VwZl v&:m8U~.NcR+x4(OZ{B\tgwc-xsѕ ΎOH ~ai? ?\#pff(£^(VB׋n(]fBI>7B<nHُ'BP1 /BPBGs<< ㏣PwzvdM#; ޅF ugxt*-eJ8 ۯ<=aTbO$y9~ +Ww‡7GB}+ '[u +gkkx+DBϑxIfψzs)GH#Mqf9a__Gگ=i# nnZDӿqЗ_QiZJG7chy>6^^{dDD/CӋhc}|wg,bQ,9+ױR"5vlb;ebWGAϼ ':U=~xlrgq68ڸBup?)nxu/,]㟝]|:/ng"!R!LEbb$?$wGGr;J0)w:voK6~anح'ᅢ[zI|(b*ZIrpJ0#Ow?uK >7uj}wN&_nӜ}h=T?{t?4\z:L.\p~f3}MoI8sy{gZs0<φNlʅl)[9϶?g 9sǯߗ+&._#:^ryfc#7A^y o?(LUwF?H62bNK"VLuO٭+3{l[[fg\q[4W}pJHӉtq>Y=%!yW.(w[5ÿw^!t~B~ZI [rLؽLTd*<]F&„L05s9$6*$Ň #dRJ%oJrD:=>GɩAcγF}!8NɓG<[Εfs+eA*n+ow5|éSP-FQuS~W63QPAfm7 +O`FnUэH{C4j|qZl<7}|I͝Ck$7ۗb1}غ;F"_4Vup[oZŻ=Xmf+v`93wNpT +n%V=^_ΟK+zYnqWnˣCL~Nr2Vj*O\T[MT{K}^FU? t[ 1>Ҹ>5~qQەfpӻ'gOvz޺ꝵ*˷i'/;[w\9K^ ʕ^T?7Ճ^}co6raknڛow@MDѣ純>SǟݓS{Nzi0t>UN7O ӗz8 wBd;>-lﵸw''B z^zy_)Xp2}/5\oWi}YKvIͿ{Mr!xS] Fm.nݣRwzɩ]ۭݵ|pO +;]Oিsv޿9<LJdz858~PgɄ~nR?~]']F|:ܺ*?}T6y9rp{Nac8 7ɍnktz?I^Z[C58<}ج)gy_ٛMoNy G|pd"6i6V\ͧ\zXz &V0.7A)R7xt Jo$ٻ.{1XI n"_Vx+R#CALAJN[y}%7WL~yZ*m=GҕlH^&ƬhQg2oLNL '4M}*cI-3oɺTDi;/NoƷ{7G6Xhr"8:ڍ{xF7B+NA 03{YND?~YsTHޤ7 3}tNpkԟONIm#cwN];m4SOrW{)f_sbMήjⒿ`Щ=Jwz;:ϻթZwׯSNw\:m>q>$tQ%Y|v:Mo|V.vVJm_w*\^2uw4T#ǟ܁[(S{U +G_{NL#si)ş%4uxl^fo [:yk7úӫM#gY44Oq?Aɿ뫾GRX>{^VԭJ:%m\[?k'q޳ ϸu_2'wɐ\'vi*p,t +&\Y{iv;[vCnLnvսӽbwt{E:evcݣ|d;} +z!޵_GOAN/Ls׵Se? +fAAN|ұiW~tŋ}>U(aS?;;|ǶNiL7imaf< tJ,+tZΈfH:fY ̌}#JtF ;eǥowN'{A?i G9yCO]xIA5wyiG3Do56A,]1$;J +{w? ])}.ܞkBU|p{璘^ܤz|ImsOSŤAax[iƚ݉9: f(|=פ\5={>=A7–A1ў|>=5=ϸtbz6 hC| oE'cX&VC7JA.,x<Lm+e̹pbaSoδa4yIW[8N)؃Na.zv +ޝi \7yv➝[)Nmݓ_B$+W~~?R +j ۉ:Ң s)rf'>:ǔX%vp!cS%OucefG͑1APf䝌6 5왷D}}-a<0}Wο>U?ǴƬUAO~w[)B28fp]1% Cۭ$A ՖcP~{.P~4;o>x͘w_<9@Ԛ!s; -^9cn3D;XfY$dl^D6KqWYw;(7W:'My|Χ{Xvѓ=]'uk71M@s64N^ u2?:/w]fbkW.CO>ӽEncz4u մcV)F0WF֠&&awhknC1Ec2#74?aO9';2/27TT'5una6e3u +R̰HD@1zAXP=0?S +9$j\d.ӆȊk;ӴfIJҳKX=CezL>tF1h3Sc)]f}Hړl wΐۻg>?* [3.`U,U,XᧅJ5|J_ʲ2":F2)v7C%ڒ0xp'+jǶ f z)4Wx .c+ۡ?ە募rY&L:m_:_-)Ncy]1l:~YL|1g@ +C\& =5FN{Q/Mt]_/akAI{N9ʡ Z%:pj&ø Қv *KKrcٯhY=ݦ+,g85y _0Uun' K2r\ x˟zjoqOXI@%X'ouo]}Z݋K!y]K9y.Ys׮{ŋ]05j#髿d7L+9_{#"*3g'Z~$b_Cxk:/N0;NUۙd4RTDǯqGPRaۡ _ +GS[m3ϗѣP :Ӂw*` a8K8Ejs: V 0箣8-ʼnigA2/U,ln/ DRU|ˍFkx݁Ӛ2y<˟{!\D$gIBOqȸ1>%s9SHI)harFM!av~֕h]K2bABdK4sW6ξ@I>Y^.45 +f<ˉY@v\Jbvf>#_EAUs$5yIxXAxԎb'zZzx|9$grL\vXJWxL\ad?R\e2؍PFᑃ+yՐyl˹ɷG A䈙ֵͥγjYk@&/~̖*/_CGbtkW5t +:j%kWՂͯi}kͯU QC7nNR5t+HoV]C7qmtef +:-%$ϩ0;ݴmxJ G!zzSydتSuq^WrKG΄鴑V<~ޟ9Q1ya-=?jv'z~!yT>.\[e9_Hr{+. +叹&,6r/̆O-͞ cp2c+lcyۧM̐V)= EdVKv;S(*1%o{>@,Xͺ9&wI+Djg)9]~/Q7XT9KӼ`ҳ9װנvJ4oa,dž݃~~񢚘y`NGdV!:"^) [)fwIe'iI(fwrˬ=ѩHw|g,s-9Px ' {?swwӇgZ| oc 3Gq>l~U_J+t,>_ }[`b'C`K<W#XP#I&4'jY̤'S$"#^Zνb*i҂]5u=WZ~w=r2;gtz]i8L oX#c-3$f^|͡wH9W+I .ȬpćGF-(ωru<2G$dw,QGfZp} 9<2^<2~]9sD6bNWu0vem)y~e~`5d2ԁ rzN/X@]Z|l&uZpQ]Igܺ:ttNb'h{GKsSgE0Q7p_ͯ[cùeA~u=uKPz8Z}ù|Գkz8[6N*nWjZ= +`%xYN$Dz~r"Ͼ}D.!P! WFA%L&Ü b]6LsgB86lmhQ^u! Y79 /G~m齜h5`gQ xw-I`iyY~x^iYBڬHeC&PsJН"R`AߟTME*T["EE*hIG6GSN2JfշoË]u)矛pp-o/aWQ +G¹xJc>y!- +'+|zUEx>V-0&z!*їGчynIf#jK!y_QvY,.nvx~y8Qڿxk\ƭ?} ŃY~N~Zddr:C+IQ;S +4{ً6h3թn*ˋynyNiy^]mNYYUHO(/Mx7:JBynlѩ>O +;)~oݮU}ί>=4yz}i}|Gޝ|w^+Ȫ†gM~|^níUn:0 +C~tv$Et߰:w#֮bD)YxccHT\lΠ%.Ь׿Io.ͻIn)/uwjHM%]"77??-Ds~n-l5q|KmƓED~/]n5?̲tnvqU>̚tn>A~YέnGj:7_{:t6{ckUӹZVnVR ԵH)aiε"O1ENQG .63o˚wQ߹򩒯r͝rm_J>WH+Ab~~uzkոef5w =Huݭ}͝V;Qsow΢g)Jr\SJO(^P0pbs= +d4Wz'q/^.Dt9 [s8'zP^犅]l(`ླ1P_Ff"qP(8snW7,Tf_@eݵRxq-;A櫰gala}EƄ`~}vyԍ {C b%l\K+i2k:u!<8ݥ.kkyYKhxֽZblB/.QȰT7vنg> +|y׾Ψnm\p7qmh0~ݟܔMy7孿 pgKS w{;WͱiڛK^}jNMZaQ\{}YAn|#I=[ǻQX r]2nELtTDff ‡_˸g"ViR2&$N-Tx1*,$J?EL/]yTWޝ8]N1kx*C1tXťv_ԸVr_Ce閺[OS]ո^z~jyf0Y7Wqyq+ wW ё3T?xknVl=vOvt>-!_x1Tڥ|/[1ݩ..iWBң.]7/v(cR^R8"'on<;#sL#|4^aKZ\E^61AQLl_u"w?CNpTد[>XgEݜNɻQʭSrҴV:;=w`̻Z[evA|1E}=Ƴ]_ܧ +%Ӆi:&aΗS45~xV̓g$ULhʼn>f,lZ!.IMr*~J6Mf]p3_ORu~j,65dhjT +'Gk^k[E!di9o/x!3Wbޙ)[>>}۫/A_8Q4׽7ӫ%Z&qq+ugM\#nߊ[d~+n'X;0?uY5ycZ|}mdN?bӫ"$ O rd3Yq-Jjԥs@ Qؘ;^ۆDjj.Y +8(夿s5pѕ ϊ?6fǽƮ,l-:qgudSe=-?I{rM-Og)ud3nڡNW9>[Hp*@5krUX<"V9_nk[h+Uz iWj㙝mK/^7U_oэls)V32_AYR@E+KfG߸~俼\G{pPt-* ooCŷ|PkGM uryJ7V r|%~7P+뷘^!j{UrCw~R]{OX^?@fn[{O-Cu{\}?a|Wʺ~ z{ˌy܃BN?o[x/P͹o½~ne[>?y_^X|YY~.&u};ƽ~mo}kƼoa7V?׼o~5Uֽ~V/:s~ H4?o^ ?/5\'>3ne9fS0i{kŃ ?$VC7"{ǛYgZ\>4c}|~}a6WcgslU Y*5^ѵxͿo6y?o~KǷRCZz1}`~ze"O?#V9JM ĚRVOmBگ.nJM)8JkM#5,働pbӭrZxL겞 yxz!OTx4:=0Ɉp'ZFMw0g޿Oa9fG05fwg0d3KŮ_o\$HX)vy͙ G67w6}S?X U[9Dիy>.%WK_܋(D ba7wa~u ۮ8j4ؕ`5`O LS8.^RÇN +X TL@9X2m=͓i1+kQUxg9mz( s>$i{Ѯ:؃14ڬ4N1Y=N{?R 55&w:+7A)I3_0j7aP.:s0Dc -I"8ŸB9f( DXx EJ3G:LO +!44>&`m4D&,ú,txC>kVGT08hBYZ$'.тS)zV`ihiMXWmf,"q7QGG?Zg딶ᄥ['G1UEb!F/]4@MË +@pu"߻Ʈ]J&ep5Ϯ  ~Bu'um!81֍&~璟e0 |aҰɮ6c̚|kú8{<OA.Kv& fm?x +K7ֺ\5M/ AOh8oFoPL j&1SȈC[?p$Ӷ y(gH!E>נ:91pC$'7 'ۈ%:H $H`V֓[,m\|<僡N%$iiqڸ#wVԊS>{ P#= 0ai#ȠjӀ#h\ k sv%tZ _J$,RzOc0"ȷnRk%a)c3)l2}EIpi\[XV1Zcp$L[ hJcؕW?t谾GUo +/_n}&xZGz^4aj6i^^q[¸Kd9nZE{t1Q}NNw6/R CSLG {0luҝFDX?KV(m49S*ntFLiu$9ʉ BG;YIWWbL<ʛu΍|7uANJliX'"ս/[7{XQ ͇爰 hmtB9N9[juu(0:! zѝ\4ۊdurdY?㷗F _jl>~z:}?__tRid/Y]a\;^>a3|կ>3EJh'y}oj'h4{fI0ќdK4]#SӸ[KuaxQO3,]WX[ `0KTi,| UK䃙Bw>ol%1ٻhS?1zZSQz`6M=pW,DҊ\KzgmuTF%C}{tyYMZt_xp̒?A 8SfB_qVS0u045c걔J EXzSZ^qjaӋ_tf$W5~=Z̃~L߅шӳz*Yܐϲ^T@MdfhﭤYB"ܿJrp",i0Q fnPx.D)OlRu'#Q'kdz +LΈ!J˴.-c#{q.%ˎҲhiNDe +i9Vu2xX}|%CjrVJ Rqd6ԔLO6m +j: -K!E ߳nB1z" sFT"bci“ؖux̼U+)ujִ" ;Pj= 9Y鞥J{&8MLLT#'4KFx۸!Q҄z"R8-G +k9O!` t }VحH܀q+meVE<$nFa/;x|E?ّIMdIpEFc*Ÿ.˚D;Ȓ ֔y1"ۅé৞S*׈k5ZOnAAnq7-gji}cKL[/ݕ`it t:ܷBWŰQqOREPYNww1Clz;vC]|M%u0X51_I󍢓,dzrn %7c~Q4: +o>^Ν8Yp5@\GV$˼i4ke7܂1y:4ݤP z΀K:mŜ1XorAQ+gJѴ +!- 2>[fN6RHӁ i"wGybt@-O9%w +ȜaΆ}#HӞT4dt?},ƣΖR:ծ1o-߲-rի**(-ڧ:'! =/ACP+b%"Wfcb +g\xAu1\ʔVqְNXz \'ݲ7{/eVzmL1<"4(H$i:545c\+:ѥ\+:Q߮W l}=!@4 +w姗N>? ,D?6Kia]u?0w%1.z˗?I_t;]W.'H¯*w`r, +(2`FQ8'8NDE?l؅,o-{:EV9!'s +J_'r\N8(*#DR@Vqj6@Ԝʈ"TE=$S<`p9QD +$2\DipL\"+N.EVɉ^4G&% 4oɚ zpg' \Z\F -$i9H%>e pV8pI79'+9vˈ9U +qQ-l*qT*E!cT. +2i@Pٜ*4LM.F(ak +as$p"%‹C`EpÈ]Z`穎}`v@cޏpg͌#8VȒhYYI(!^5aT~ +ryh͉lN`T9  $pr@|ex +l8nlj + )Vqw LN_e%y؎GX>' dcA,TB +(92"* +OQCg PeNLmX0AI(INAaWIvAr<UYVg2h4z@r¼"Ye$ nJ4DĒlPTH@Jdp&pq6MLi<'tyx WyV" d]/̟VS}26Jt#G*Xq0(p0c )!OK` D@f+">cY endstream endobj 203 0 obj <>stream +("U$fpgY C< JrpD4_%,NCPGN'N3s0n![< +-T]e}%s:EE=slNbY}d=yXE$J",e@0bNBU Q%+ ,^54I$2 ×V`yϠuB Є2Ee2MЇF(b>e!HRyV3`[ɴxBK'sD67yXNpZCNYSb-z0c;1|YF]~1ō Y#F-|9;;rDÉ 4ᵓTQhX9Ё>2J8Nִ:7"֊aV Ts'N8ZQ9/*)D.'DqE^%"W +@jaP +""4<#ҩ*K(,*hn@Ŀ̓Ǖ:OSMsAH%H~LJtdF+IƦ0 ^%\faX@ X<^ +tH;,Wp$Dp",!/ 0RI$9e8dH)Ud`;oE@<Մd>jWTQ¥@m YcPpdt aup: S vԂuTi!95rTWEcep xʒ$ ,#!9BbQ@br94 ;KuaωpPXx 4 n/.U&k ě*IS "{ZߘkJ,SDZpOrV"1QDA+kp vqK90Dm/UY>4C]75l@XQ$$^&cѷ 0X}'-ȩ+WtEqI(ghb)y@o`^9h(<U`GP7{dcdhJL`@*S p82$h*&>iy,zaYkoyt1Hb*Dr 3D@$r620X,Q [Q Po$Y^N&҆ö= +9WY}U 9p4.##P!p YmN bC ,cqiOUTSUӌBɰDh xJd= g߆ut:Em@?555h *4r"1PD>qZbS>d xP h&t#;G@tp!&pmAՌDX#U kij/D Y^RQ &̃TajUstV;sٹXKI$D<+Ԭs`0$J[-0Ja@Fd!̼I`Dj4Gg&f`NϦZ@s*Vq]zD˲a6 dZ@Q +ҽ stf;jbٹ" 8Nq0AS$-a#JAF (֩+1` 1N!1JujSspV;k +&6L ˲A? =3"•jA+ȶfjg!@ZP@3"$c:nfg(o6{r]ʒ oe &UZ*6\x-1қL G%#3Y7qΓ$;L<  /ЪeR2̪aXh-l&Rh(ZLu6?MΚmv fh?h anj^Тթ0Uv4a&r46 +dc R Ll,F\Tav(l3s%$Mf, +`r79sYe -[@b2 +dJq +ơQHN Y͌3fmc2m 9[VоophZ= I:(Q 'h0/ Zx}fH>65s(L7 C~V'<ڃBJt33bm(kdR@Y7R-dGVH?3fg ~Ts:6 +N-i-Nt.e TFFNMzEO "Ed=fgJu<ÙNO  ĹcLM:A'T;зPY W|@#]} -юkv4y:  } ZHPdD'<2Վkvd9 Z +@LT8'$H4@iV́$N('„1ARLTK%Ge3ZY7QΒ=j"kwv@̓kR8hO2eG9S(+Z@N1^u&7љ9fټjIsL1Z<)<MWDtMlHU75 )lXQCU4A'*X t fִ(Қ޻)rdzc_1l%Hg4s|q4tIBB|x^[c}@3[!j$ Lxh}V +~xlZQO}bX8Rr0̚&0C__Ns6*q)HDSkI9$UKtdž~;s+bF2U4S+aBA{PC_ڸnE<RƿsK^da-H7f"b'=$KErz?5alj_HiH߿?$twXS,9 xr< _9-nѺ(}Jo? <  yTI䪈8Fރ/W&C`C{m5_޺TU}*ӝIRA`Kmݘ>H{9 Y@JJKu-NqKr%28̠7hZ9.fx9H\Y@@夥ڌeagEXt*{)%WGE@%y. !ɝR D~!'$Xi6GżVCO%ܵ\zJB8J[Mgܵō[\>l. y94˨k E7>*z$Ws0褴zr8u-tEF9عרEt^Օ(n'-8]4$'*`XH>߷)?'(̤>զ^{S۬Ttzɯ{["eLiixCb;y-ˏNr;t2YƔ*3ZhR\S!οeIJ +r2ג7ĝqe[uQYb4^Zͮh8m^,z[*10kIs[aÙKyk+AnЈiQArK-b뭟-{ 𲴒ePr~$'QC9A-9u\tk{+YQ2!*-DVu*S䵬m: >k 9y-HnѺ(}*CBNrӐqAF`K*xkH+$u'y”*3[hݢmQ,:SzoEkxT [֭F|&N%^2zZHlAvKmr<,L34O]`)-[솇$K!Q^W<:v{]FaK_ [j{]ȫ{5@M#8lL7F)ՙnr}-@9*3[|2neQuSYs+A6N`&'yj2Tj-AN; i.%o:-ʥH]/rHu +[29(zԕ9$PiQ1AtK-b~뭟>pɠrpɃ3N`KV 0nA%1 cNKU)-}щna^[URDNen  eK7r% +OkS[r\k{U-DMښ lnMDT* ~ +[AMڂ_MDh]>m\HLQ 4^aDt$Y5~1up2m.`{4-nDu`=UDvgNC܎<#,i*gS9N(rQ[@姥ڌŖlԺ(}29@㨅<[<3YyjEE%sOϓ"Y^.uwR̿>(v&/vFP1bKW\*+e| +Y*3[v;-5-Es_)ETfce?q\F)k*A" RUaK_ [j{mV'LiNsزݹncc)g,!]2-?FԥMyO͡#>7Pi)ÖoeJ,ue9gTnZL ls-b~롟r7yyM2pȶtZ\re0EhLK-}5xnuQൽU~"@]f5 31?I-[B"cN_tEjbVC/Ek8]4-AtDRx43Ք#D7)nDtvE9o|E7cΏDtKS!yA`$D9Tisŵ@gymNtX'EۼTt9so [ĭM 3"/xnnRnȈ +fJ-E:-,E~(@#ݚ>vj 4V2\ꒇSU,JMK-]9-5˥^Ym!$n rZdѴ3+BIpY`FO,:>|h{Moܽ)r1g5Hl}ntLuQ+Ι3 QsšU4K=3r%ڝHd3=MNDbsr&iN9-NvڂAvEW-^xOP$ NbKA4}Ah ̓וC-j2/nѪ(dMz(B݃H(޵Ib0~! B:*X&s}^ߞ3^-%G`YaS4r_tgW4>r𬌉!àQFŮSqXǩ3$(-pu1ދR= S5{¿׆ 1͕M.6avKVY3"5ې+Ax+H4ɜPkCREQoH}᫖ߋ{R9d2=Q: ;2d1)Xbݡ% GՒO*X}* |x+Ɩv'' S*g^F hs+v. < BoMjsЮ ]n5/ ͩнӲ#pI}&u Zg>m䧕tڰgOXNJNݱh,k/sh Ҡx:>|4jIJ fFz,duIziOϢ9Pif-MFn a5fL>נ3Xpv›ӨS|z{)iєPƒrInsF.;tWpjFt+p9JNtuAWeÏx-踛CH"OQDD8z8'A[d=$A U\07Apu[*,T]AfVRЭwާ&-C3TF¤kd)] +JPHA 4)nA=Ao<.AOWbucrP2.!9($mArF䠂grP$B܌#CHD(w%mRB; Lf +lje)hL +*p]vhBg ,Z[ +eB-&ڳijຶrT|^~jb|Šr?GA&Ġ 1PBnד A`ntH2TBv Xvt RJyAXk\Y +N!JAbRaRP:TB +*s{'u\I 96ARcl18jRkB 6<8qr6ɛr(]%AXWoY¶d:L hr]nxp< dqٞ?9m|E*KSH~f. wyN=spSCi}16ko}Sׂ l7H*&Ֆ-:B(RӷdcwUz:sϱRW vTwrU|@jSl.M23jDʙ ^y[j.!2BbѦA*RLh sh3[˹l`7|t ڒMH-i 1$} %nY]j d($ˤ_aZNRviX%c !iUl28q+(z=7.XWYaKW|:h&pa̳v`6]6dkکru5 FA$`O_Έ88SόAsZlQ*]Cm0:'$i\W;Q[A2drJBV8ͮsNۇ< 來e21OuA]J%QECJ4=lfZo^:,n]e( ɢ؅Is6S7d vQfsyfb@)>fYG3_, 5VsWr +^Խv 3@::|@!JdGq5LE _/ E}eqC\ZוUxmw\+Z_JDރGrP5_c(4\{S &uY~<>B t< H[#Xz4=!T΢{*7}c.GdbPdSjC@0M?ey9̣mM.fTț,b024o3ku6lZ&mSvn;]X21^f!q P;WdWnbߗeAA][)2*:x.im}Dlp{ KZs߇EE,9uP`x<@=ӻU%--9p;xD>׭!m=m0׫av ~s5 (B0䦖@M-Jc fZ~ٰ'}\"qҺ=i /c9Xl&'vz(tL#wlЉr` dcs ^UI=g<\4v,dC*B?NE:TmM?3 @ת!H%P{G5A*<݌ t&.2D]sl⼶ү_nMslzi[dxRKh&ZLك/%l z*&6(rW⋜v喥9o~x{rƘ ?3v@hb Cq*wNB4G\i\f#); +M)dp#Tl…~v70fO5VU$Пa/5@;'c%ӚO|ѝcq 53Y/{\QW &AHG.#.KZf4ry*'CpZXE.#-؁VU$dA_5n 0 TfIYE&D]|6omXQzMN4g0gwLdPx~eteWDIHX{ $ #;(5TWfpZvj>ӥCgќUOgȕ F^wAF '4ϑTfh>F@UZs荓R}LPR`{> yC$N5b?4"7֖9+/ښ$@E0~ .S/??ZuZ&a$~ vKyɁU@Hߎǚy^n$O@JM4٣pʠ~ 9`@I'AyN104[p^v\LIS V 18ŕF rCҤ儀n;cXIt +r[ߞsZFRj +6j +35R+RͨpScJNt2YryМ4⻓Sj!JN|jSjpz$ĩ) Sf +?J̔ʠӹ3SXyڙ)TZf0cmM2Fܙ) fdqLԸD) e1:H~Dsjf{r:a*fJ)!(q%ͷK*NCMXfBp*5![߸).Rn0"7T0A1INf2pK*&=xԈSn +L22NRnJ*2P3A)1%f~0q%0i bܷkiBŘdp_v=(;ଙDwD)Tqv +goQQs&v +aꯄs[urلⲸ +NGnS D5t!@n5US4^.eAPdpcL%N!՚@eHS)Śˌ^i>g> 3Yԙ:`&u& \ͮgnubuupteӮ>QV@}rr,#+Tf~eN R7e&*ap[W`^o /6'wO#y잾~81-rL 3;\rKRw5.3ff*<!(ΐht*`?AOcԾv_时@/5vhŲPiQʾaj@2z1tPsfApPb6AqU5J +BPY&`#!Ls5@=CnywyujFၘtț^C PMC VR:e[2*7@נ3NjI-3gqRceۍNj I>o#" wYӺKFJd@fI9L,f^R+ !hNj@SNpR'0Ĉme}&Ib[;hr'uI=6i#UG;Nr}S +}x=yü\<}Ԁ% +Q3a;>jB|ԜL'2Hbv eP$7|}J.ڵq$Z#Ph2R佦tXEȔLGa}0A!5헆|hH~g-?a\hۂ8Fq+`}Z$Ta5N nyaqju#^L2C{ t7Me\)H^SkSuv JZ&mMALJ=@ue.&!L~XCuS^t?n?LPZt4̘LF)4@SΡNrӆ4%*݃EI +AN)'YiC]fq(0qYjiQG ȱi5"2,}pQt[~S%ۊ&jNDy*E4tl81_fw/岳&(}iPBÎpJ˝"=X,OfJE:D>)`Sg] Tos{3].!.`Yn n^?Z,K7MVۥK *_] 4ՑR=Wq"W,*8`5: ,=A%ٷrr^uslFhVhѬK4}1EG7.:r3+"royg}COyXwI5JJ>(CH`6r{@e]JEN&=L"v$%x*!Cl*CǦL(.PTiBCV"3?DƝ +"W^p &DµS.yfNXopAe2}!}M~i`o j2\$9ot^mnnN^[Y4+"]YYQ (_ҕPfee3[D`}+ 5(OͭUcq4Pl.Ӫ5y䥦&Y[@5@S|vW} -)Ŵ,WԥbEM|dKJ)ܜSL#Ez'CnNLu0qjNKΜvyV%>ϚMaHyϠ_zgK5sQdp? +mE'p9edR͗8D~]C`YʋL !5Z=%M)+xREFl-a[M>4-W/ +[EQ? v`TCTy6j%YMrZ/K{_Sslvܻ*C {4Yf' IZ(V58կUK<,I]ꭸKyIB2H"2~b&׸mZmm׫֨/"V&6:ϯ}~oCo_?w??ǿ_/~_?o?@X1CR endstream endobj 190 0 obj [/ICCBased 194 0 R] endobj 7 0 obj <> endobj 39 0 obj <> endobj 70 0 obj <> endobj 101 0 obj <> endobj 130 0 obj <> endobj 155 0 obj <> endobj 170 0 obj [/View/Design] endobj 171 0 obj <>>> endobj 145 0 obj [/View/Design] endobj 146 0 obj <>>> endobj 116 0 obj [/View/Design] endobj 117 0 obj <>>> endobj 85 0 obj [/View/Design] endobj 86 0 obj <>>> endobj 54 0 obj [/View/Design] endobj 55 0 obj <>>> endobj 23 0 obj [/View/Design] endobj 24 0 obj <>>> endobj 181 0 obj [180 0 R] endobj 204 0 obj <> endobj xref 0 205 0000000004 65535 f +0000000016 00000 n +0000000238 00000 n +0000065397 00000 n +0000000005 00000 f +0000000006 00000 f +0000000008 00000 f +0000322352 00000 n +0000000010 00000 f +0000065448 00000 n +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000022 00000 f +0000000025 00000 f +0000323372 00000 n +0000323403 00000 n +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000036 00000 f +0000000037 00000 f +0000000038 00000 f +0000000040 00000 f +0000322422 00000 n +0000000041 00000 f +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000048 00000 f +0000000049 00000 f +0000000050 00000 f +0000000051 00000 f +0000000052 00000 f +0000000053 00000 f +0000000056 00000 f +0000323256 00000 n +0000323287 00000 n +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000062 00000 f +0000000063 00000 f +0000000064 00000 f +0000000065 00000 f +0000000066 00000 f +0000000067 00000 f +0000000068 00000 f +0000000069 00000 f +0000000071 00000 f +0000322493 00000 n +0000000072 00000 f +0000000073 00000 f +0000000074 00000 f +0000000075 00000 f +0000000076 00000 f +0000000077 00000 f +0000000078 00000 f +0000000079 00000 f +0000000080 00000 f +0000000081 00000 f +0000000082 00000 f +0000000083 00000 f +0000000084 00000 f +0000000087 00000 f +0000323140 00000 n +0000323171 00000 n +0000000088 00000 f +0000000089 00000 f +0000000090 00000 f +0000000091 00000 f +0000000092 00000 f +0000000093 00000 f +0000000094 00000 f +0000000095 00000 f +0000000096 00000 f +0000000097 00000 f +0000000098 00000 f +0000000099 00000 f +0000000100 00000 f +0000000102 00000 f +0000322564 00000 n +0000000103 00000 f +0000000104 00000 f +0000000105 00000 f +0000000106 00000 f +0000000107 00000 f +0000000108 00000 f +0000000109 00000 f +0000000110 00000 f +0000000111 00000 f +0000000112 00000 f +0000000113 00000 f +0000000114 00000 f +0000000115 00000 f +0000000118 00000 f +0000323022 00000 n +0000323054 00000 n +0000000119 00000 f +0000000120 00000 f +0000000121 00000 f +0000000122 00000 f +0000000123 00000 f +0000000124 00000 f +0000000125 00000 f +0000000126 00000 f +0000000127 00000 f +0000000128 00000 f +0000000129 00000 f +0000000131 00000 f +0000322638 00000 n +0000000132 00000 f +0000000133 00000 f +0000000134 00000 f +0000000135 00000 f +0000000136 00000 f +0000000137 00000 f +0000000138 00000 f +0000000139 00000 f +0000000140 00000 f +0000000141 00000 f +0000000142 00000 f +0000000143 00000 f +0000000144 00000 f +0000000147 00000 f +0000322904 00000 n +0000322936 00000 n +0000000148 00000 f +0000000149 00000 f +0000000150 00000 f +0000000151 00000 f +0000000152 00000 f +0000000153 00000 f +0000000154 00000 f +0000000000 00000 f +0000322712 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000322786 00000 n +0000322818 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000091218 00000 n +0000323488 00000 n +0000065879 00000 n +0000075746 00000 n +0000091534 00000 n +0000088532 00000 n +0000088418 00000 n +0000091410 00000 n +0000077488 00000 n +0000075810 00000 n +0000322315 00000 n +0000076924 00000 n +0000076974 00000 n +0000088354 00000 n +0000088569 00000 n +0000091292 00000 n +0000091324 00000 n +0000091610 00000 n +0000091857 00000 n +0000092901 00000 n +0000107814 00000 n +0000173403 00000 n +0000238992 00000 n +0000304581 00000 n +0000323515 00000 n +trailer <<23EE6098814147C2A9B4181A633AF0BC>]>> startxref 323816 %%EOF \ No newline at end of file diff --git a/web/assets/images/PiCluster_1A.svg b/web/assets/images/PiCluster_1A.svg new file mode 100644 index 0000000..029a020 --- /dev/null +++ b/web/assets/images/PiCluster_1A.svg @@ -0,0 +1,370 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/assets/images/alert.png b/web/assets/images/alert.png new file mode 100644 index 0000000..8358ca1 Binary files /dev/null and b/web/assets/images/alert.png differ diff --git a/web/assets/images/android-chrome-192x192.png b/web/assets/images/android-chrome-192x192.png new file mode 100644 index 0000000..d64dc48 Binary files /dev/null and b/web/assets/images/android-chrome-192x192.png differ diff --git a/web/assets/images/android-chrome-384x384.png b/web/assets/images/android-chrome-384x384.png new file mode 100644 index 0000000..ac4b746 Binary files /dev/null and b/web/assets/images/android-chrome-384x384.png differ diff --git a/web/assets/images/android-chrome-512x512.png b/web/assets/images/android-chrome-512x512.png new file mode 100644 index 0000000..fb042c0 Binary files /dev/null and b/web/assets/images/android-chrome-512x512.png differ diff --git a/web/assets/images/apple-touch-icon.png b/web/assets/images/apple-touch-icon.png new file mode 100644 index 0000000..a015047 Binary files /dev/null and b/web/assets/images/apple-touch-icon.png differ diff --git a/web/assets/images/background.jpg b/web/assets/images/background.jpg new file mode 100644 index 0000000..973a28e Binary files /dev/null and b/web/assets/images/background.jpg differ diff --git a/web/assets/images/browserconfig.xml b/web/assets/images/browserconfig.xml new file mode 100644 index 0000000..b3930d0 --- /dev/null +++ b/web/assets/images/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/web/assets/images/favicon-16x16.png b/web/assets/images/favicon-16x16.png new file mode 100644 index 0000000..38bd2ff Binary files /dev/null and b/web/assets/images/favicon-16x16.png differ diff --git a/web/assets/images/favicon-32x32.png b/web/assets/images/favicon-32x32.png new file mode 100644 index 0000000..d60d686 Binary files /dev/null and b/web/assets/images/favicon-32x32.png differ diff --git a/web/assets/images/favicon.ico b/web/assets/images/favicon.ico new file mode 100644 index 0000000..d08a627 Binary files /dev/null and b/web/assets/images/favicon.ico differ diff --git a/web/assets/images/function.png b/web/assets/images/function.png new file mode 100644 index 0000000..3a6d69e Binary files /dev/null and b/web/assets/images/function.png differ diff --git a/web/assets/images/logo2.png b/web/assets/images/logo2.png new file mode 100644 index 0000000..42fd3a3 Binary files /dev/null and b/web/assets/images/logo2.png differ diff --git a/web/assets/images/manifest.json b/web/assets/images/manifest.json new file mode 100644 index 0000000..4fbe181 --- /dev/null +++ b/web/assets/images/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/web/assets/images/mstile-150x150.png b/web/assets/images/mstile-150x150.png new file mode 100644 index 0000000..fb79d7a Binary files /dev/null and b/web/assets/images/mstile-150x150.png differ diff --git a/web/assets/images/network.png b/web/assets/images/network.png new file mode 100644 index 0000000..50fae5f Binary files /dev/null and b/web/assets/images/network.png differ diff --git a/web/assets/images/safari-pinned-tab.svg b/web/assets/images/safari-pinned-tab.svg new file mode 100644 index 0000000..09dd364 --- /dev/null +++ b/web/assets/images/safari-pinned-tab.svg @@ -0,0 +1,163 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/web/assets/images/searching.jpg b/web/assets/images/searching.jpg new file mode 100644 index 0000000..bc62649 Binary files /dev/null and b/web/assets/images/searching.jpg differ diff --git a/web/assets/images/server.jpg b/web/assets/images/server.jpg new file mode 100644 index 0000000..7d63955 Binary files /dev/null and b/web/assets/images/server.jpg differ diff --git a/web/assets/images/sphere.png b/web/assets/images/sphere.png new file mode 100644 index 0000000..428dd82 Binary files /dev/null and b/web/assets/images/sphere.png differ diff --git a/web/assets/images/theme/default/logo.png b/web/assets/images/theme/default/logo.png new file mode 100644 index 0000000..d425245 Binary files /dev/null and b/web/assets/images/theme/default/logo.png differ diff --git a/web/assets/images/theme/jerry/logo.png b/web/assets/images/theme/jerry/logo.png new file mode 100644 index 0000000..b71f7a2 Binary files /dev/null and b/web/assets/images/theme/jerry/logo.png differ diff --git a/web/assets/images/ui-bg_glass_85_dfeffc_1x400.png b/web/assets/images/ui-bg_glass_85_dfeffc_1x400.png new file mode 100644 index 0000000..be72a87 Binary files /dev/null and b/web/assets/images/ui-bg_glass_85_dfeffc_1x400.png differ diff --git a/web/assets/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png b/web/assets/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png new file mode 100644 index 0000000..38e26fb Binary files /dev/null and b/web/assets/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png differ diff --git a/web/assets/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/web/assets/images/ui-bg_inset-hard_100_fcfdfd_1x100.png new file mode 100644 index 0000000..78995e2 Binary files /dev/null and b/web/assets/images/ui-bg_inset-hard_100_fcfdfd_1x100.png differ diff --git a/web/assets/images/ui-icons_469bdd_256x240.png b/web/assets/images/ui-icons_469bdd_256x240.png new file mode 100644 index 0000000..650ab55 Binary files /dev/null and b/web/assets/images/ui-icons_469bdd_256x240.png differ diff --git a/web/assets/images/ui-icons_6da8d5_256x240.png b/web/assets/images/ui-icons_6da8d5_256x240.png new file mode 100644 index 0000000..3a69a06 Binary files /dev/null and b/web/assets/images/ui-icons_6da8d5_256x240.png differ diff --git a/web/assets/images/ui-icons_f9bd01_256x240.png b/web/assets/images/ui-icons_f9bd01_256x240.png new file mode 100644 index 0000000..f2d3149 Binary files /dev/null and b/web/assets/images/ui-icons_f9bd01_256x240.png differ diff --git a/web/assets/jquery-ui.css b/web/assets/jquery-ui.css new file mode 100644 index 0000000..34dbc52 --- /dev/null +++ b/web/assets/jquery-ui.css @@ -0,0 +1,1312 @@ +/*! jQuery UI - v1.12.1 - 2017-07-23 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} + + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-selectable { + -ms-touch-action: none; + touch-action: none; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: .5em .5em .5em .7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-item-wrapper { + position: relative; + padding: 3px 1em 3px .4em; +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item-wrapper { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-button { + padding: .4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + /* Support: IE <= 11 */ + overflow: visible; +} + +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} + +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} + +/* no icon support for input elements */ +input.ui-button.ui-button-icon-only { + text-indent: 0; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} + +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; + +} + +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: .4em 1em; +} + +/* workarounds */ +/* Support: Firefox 5 - 40 */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: .4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} + +/* Spinner specific style fixes */ +.ui-controlgroup-vertical .ui-spinner-input { + + /* Support: IE8 only, Android < 4.4 only */ + width: 75%; + width: calc( 100% - 2.4em ); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} + +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: .12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: .5em; + top: .3em; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); + height: 100%; + filter: alpha(opacity=25); /* support: IE8 */ + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} +.ui-selectmenu-menu .ui-menu { + overflow: auto; + overflow-x: hidden; + padding-bottom: 1px; +} +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 1.5; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} +.ui-selectmenu-open { + display: block; +} +.ui-selectmenu-text { + display: block; + margin-right: 20px; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-selectmenu-button.ui-button { + text-align: left; + white-space: nowrap; + width: 14em; +} +.ui-selectmenu-icon.ui-icon { + float: right; + margin-top: 0; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; + -ms-touch-action: none; + touch-action: none; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* support: IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: .222em 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 2em; +} +.ui-spinner-button { + width: 1.6em; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top-style: none; + border-bottom-style: none; + border-right-style: none; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; +} +body .ui-tooltip { + border-width: 2px; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #ffffff; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #dddddd; + background: #e9e9e9; + color: #333333; + font-weight: bold; +} +.ui-widget-header a { + color: #333333; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #cccccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #ffffff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #ffffff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #ffffff; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_555555_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_ffffff_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_777620_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cc0000_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_777777_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; + filter: Alpha(Opacity=30); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: 0px 0px 5px #666666; + box-shadow: 0px 0px 5px #666666; +} diff --git a/web/assets/jquery-ui.js b/web/assets/jquery-ui.js new file mode 100644 index 0000000..ea14d35 --- /dev/null +++ b/web/assets/jquery-ui.js @@ -0,0 +1,18706 @@ +/*! jQuery UI - v1.12.1 - 2017-07-23 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.ui = $.ui || {}; + +var version = $.ui.version = "1.12.1"; + + +/*! + * jQuery UI Widget 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Widget +//>>group: Core +//>>description: Provides a factory for creating stateful widgets with a common API. +//>>docs: http://api.jqueryui.com/jQuery.widget/ +//>>demos: http://jqueryui.com/widget/ + + + +var widgetUuid = 0; +var widgetSlice = Array.prototype.slice; + +$.cleanData = ( function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // Http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +} )( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var existingConstructor, constructor, basePrototype; + + // ProxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + var proxiedPrototype = {}; + + var namespace = name.split( "." )[ 0 ]; + name = name.split( "." )[ 1 ]; + var fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + if ( $.isArray( prototype ) ) { + prototype = $.extend.apply( null, [ {} ].concat( prototype ) ); + } + + // Create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + + // Allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // Allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + // Extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + + // Copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + + // Track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + } ); + + basePrototype = new base(); + + // We need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = ( function() { + function _super() { + return base.prototype[ prop ].apply( this, arguments ); + } + + function _superApply( args ) { + return base.prototype[ prop ].apply( this, args ); + } + + return function() { + var __super = this._super; + var __superApply = this._superApply; + var returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + } )(); + } ); + constructor.prototype = $.widget.extend( basePrototype, { + + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + } ); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // Redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, + child._proto ); + } ); + + // Remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widgetSlice.call( arguments, 1 ); + var inputIndex = 0; + var inputLength = input.length; + var key; + var value; + + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string"; + var args = widgetSlice.call( arguments, 1 ); + var returnValue = this; + + if ( isMethodCall ) { + + // If this is an empty collection, we need to have the instance method + // return undefined instead of the jQuery instance + if ( !this.length && options === "instance" ) { + returnValue = undefined; + } else { + this.each( function() { + var methodValue; + var instance = $.data( this, fullName ); + + if ( options === "instance" ) { + returnValue = instance; + return false; + } + + if ( !instance ) { + return $.error( "cannot call methods on " + name + + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + + if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + + " widget instance" ); + } + + methodValue = instance[ options ].apply( instance, args ); + + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + } ); + } + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat( args ) ); + } + + this.each( function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + } ); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + + options: { + classes: {}, + disabled: false, + + // Callbacks + create: null + }, + + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widgetUuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + this.classesElementLookup = {}; + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + } ); + this.document = $( element.style ? + + // Element within the document + element.ownerDocument : + + // Element is window or document + element.document || element ); + this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + + if ( this.options.disabled ) { + this._setOptionDisabled( this.options.disabled ); + } + + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + + _getCreateOptions: function() { + return {}; + }, + + _getCreateEventData: $.noop, + + _create: $.noop, + + _init: $.noop, + + destroy: function() { + var that = this; + + this._destroy(); + $.each( this.classesElementLookup, function( key, value ) { + that._removeClass( value, key ); + } ); + + // We can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .off( this.eventNamespace ) + .removeData( this.widgetFullName ); + this.widget() + .off( this.eventNamespace ) + .removeAttr( "aria-disabled" ); + + // Clean up events and states + this.bindings.off( this.eventNamespace ); + }, + + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + var parts; + var curOption; + var i; + + if ( arguments.length === 0 ) { + + // Don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + + // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + + _setOption: function( key, value ) { + if ( key === "classes" ) { + this._setOptionClasses( value ); + } + + this.options[ key ] = value; + + if ( key === "disabled" ) { + this._setOptionDisabled( value ); + } + + return this; + }, + + _setOptionClasses: function( value ) { + var classKey, elements, currentElements; + + for ( classKey in value ) { + currentElements = this.classesElementLookup[ classKey ]; + if ( value[ classKey ] === this.options.classes[ classKey ] || + !currentElements || + !currentElements.length ) { + continue; + } + + // We are doing this to create a new jQuery object because the _removeClass() call + // on the next line is going to destroy the reference to the current elements being + // tracked. We need to save a copy of this collection so that we can add the new classes + // below. + elements = $( currentElements.get() ); + this._removeClass( currentElements, classKey ); + + // We don't use _addClass() here, because that uses this.options.classes + // for generating the string of classes. We want to use the value passed in from + // _setOption(), this is the new value of the classes option which was passed to + // _setOption(). We pass this value directly to _classes(). + elements.addClass( this._classes( { + element: elements, + keys: classKey, + classes: value, + add: true + } ) ); + } + }, + + _setOptionDisabled: function( value ) { + this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this._removeClass( this.hoverable, null, "ui-state-hover" ); + this._removeClass( this.focusable, null, "ui-state-focus" ); + } + }, + + enable: function() { + return this._setOptions( { disabled: false } ); + }, + + disable: function() { + return this._setOptions( { disabled: true } ); + }, + + _classes: function( options ) { + var full = []; + var that = this; + + options = $.extend( { + element: this.element, + classes: this.options.classes || {} + }, options ); + + function processClassString( classes, checkOption ) { + var current, i; + for ( i = 0; i < classes.length; i++ ) { + current = that.classesElementLookup[ classes[ i ] ] || $(); + if ( options.add ) { + current = $( $.unique( current.get().concat( options.element.get() ) ) ); + } else { + current = $( current.not( options.element ).get() ); + } + that.classesElementLookup[ classes[ i ] ] = current; + full.push( classes[ i ] ); + if ( checkOption && options.classes[ classes[ i ] ] ) { + full.push( options.classes[ classes[ i ] ] ); + } + } + } + + this._on( options.element, { + "remove": "_untrackClassesElement" + } ); + + if ( options.keys ) { + processClassString( options.keys.match( /\S+/g ) || [], true ); + } + if ( options.extra ) { + processClassString( options.extra.match( /\S+/g ) || [] ); + } + + return full.join( " " ); + }, + + _untrackClassesElement: function( event ) { + var that = this; + $.each( that.classesElementLookup, function( key, value ) { + if ( $.inArray( event.target, value ) !== -1 ) { + that.classesElementLookup[ key ] = $( value.not( event.target ).get() ); + } + } ); + }, + + _removeClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, false ); + }, + + _addClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, true ); + }, + + _toggleClass: function( element, keys, extra, add ) { + add = ( typeof add === "boolean" ) ? add : extra; + var shift = ( typeof element === "string" || element === null ), + options = { + extra: shift ? keys : extra, + keys: shift ? element : keys, + element: shift ? this.element : element, + add: add + }; + options.element.toggleClass( this._classes( options ), add ); + return this; + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement; + var instance = this; + + // No suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // No element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + + // Allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // Copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ); + var eventName = match[ 1 ] + instance.eventNamespace; + var selector = match[ 2 ]; + + if ( selector ) { + delegateElement.on( eventName, selector, handlerProxy ); + } else { + element.on( eventName, handlerProxy ); + } + } ); + }, + + _off: function( element, eventName ) { + eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.off( eventName ).off( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); + }, + mouseleave: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-hover" ); + } + } ); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-focus" ); + }, + focusout: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-focus" ); + } + } ); + }, + + _trigger: function( type, event, data ) { + var prop, orig; + var callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + + // The original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // Copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + + var hasOptions; + var effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + + if ( options.delay ) { + element.delay( options.delay ); + } + + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue( function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + } ); + } + }; +} ); + +var widget = $.widget; + + +/*! + * jQuery UI Position 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + +//>>label: Position +//>>group: Core +//>>description: Positions elements relative to other elements. +//>>docs: http://api.jqueryui.com/position/ +//>>demos: http://jqueryui.com/position/ + + +( function() { +var cachedScrollbarWidth, + max = Math.max, + abs = Math.abs, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[ 0 ]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
" + + "
" ), + innerDiv = div.children()[ 0 ]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[ 0 ].clientWidth; + } + + div.remove(); + + return ( cachedScrollbarWidth = w1 - w2 ); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[ 0 ] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9, + hasOffset = !isWindow && !isDocument; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + width: withinElement.outerWidth(), + height: withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // Make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[ 0 ].preventDefault ) { + + // Force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + + // Clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // Force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1 ) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // Calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // Reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + } ); + + // Normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each( function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem: elem + } ); + } + } ); + + if ( options.using ) { + + // Adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + } ); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // Element is wider than within + if ( data.collisionWidth > outerWidth ) { + + // Element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - + withinOffset; + position.left += overLeft - newOverRight; + + // Element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + + // Element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + + // Too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + + // Too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + + // Adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // Element is taller than within + if ( data.collisionHeight > outerHeight ) { + + // Element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - + withinOffset; + position.top += overTop - newOverBottom; + + // Element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + + // Element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + + // Too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + + // Too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + + // Adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - + outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - + outerHeight - withinOffset; + if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + + offset - offsetTop; + if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +} )(); + +var position = $.ui.position; + + +/*! + * jQuery UI :data 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :data Selector +//>>group: Core +//>>description: Selects elements which have data stored under the specified key. +//>>docs: http://api.jqueryui.com/data-selector/ + + +var data = $.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo( function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + } ) : + + // Support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + } +} ); + +/*! + * jQuery UI Disable Selection 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: disableSelection +//>>group: Core +//>>description: Disable selection of text content within the set of matched elements. +//>>docs: http://api.jqueryui.com/disableSelection/ + +// This file is deprecated + + +var disableSelection = $.fn.extend( { + disableSelection: ( function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.on( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + } ); + }; + } )(), + + enableSelection: function() { + return this.off( ".ui-disableSelection" ); + } +} ); + + +/*! + * jQuery UI Focusable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :focusable Selector +//>>group: Core +//>>description: Selects elements which can be focused. +//>>docs: http://api.jqueryui.com/focusable-selector/ + + + +// Selectors +$.ui.focusable = function( element, hasTabindex ) { + var map, mapName, img, focusableIfVisible, fieldset, + nodeName = element.nodeName.toLowerCase(); + + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap='#" + mapName + "']" ); + return img.length > 0 && img.is( ":visible" ); + } + + if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) { + focusableIfVisible = !element.disabled; + + if ( focusableIfVisible ) { + + // Form controls within a disabled fieldset are disabled. + // However, controls within the fieldset's legend do not get disabled. + // Since controls generally aren't placed inside legends, we skip + // this portion of the check. + fieldset = $( element ).closest( "fieldset" )[ 0 ]; + if ( fieldset ) { + focusableIfVisible = !fieldset.disabled; + } + } + } else if ( "a" === nodeName ) { + focusableIfVisible = element.href || hasTabindex; + } else { + focusableIfVisible = hasTabindex; + } + + return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) ); +}; + +// Support: IE 8 only +// IE 8 doesn't resolve inherit to visible/hidden for computed values +function visible( element ) { + var visibility = element.css( "visibility" ); + while ( visibility === "inherit" ) { + element = element.parent(); + visibility = element.css( "visibility" ); + } + return visibility !== "hidden"; +} + +$.extend( $.expr[ ":" ], { + focusable: function( element ) { + return $.ui.focusable( element, $.attr( element, "tabindex" ) != null ); + } +} ); + +var focusable = $.ui.focusable; + + + + +// Support: IE8 Only +// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop +// with a string, so we need to find the proper form. +var form = $.fn.form = function() { + return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form ); +}; + + +/*! + * jQuery UI Form Reset Mixin 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Form Reset Mixin +//>>group: Core +//>>description: Refresh input widgets when their form is reset +//>>docs: http://api.jqueryui.com/form-reset-mixin/ + + + +var formResetMixin = $.ui.formResetMixin = { + _formResetHandler: function() { + var form = $( this ); + + // Wait for the form reset to actually happen before refreshing + setTimeout( function() { + var instances = form.data( "ui-form-reset-instances" ); + $.each( instances, function() { + this.refresh(); + } ); + } ); + }, + + _bindFormResetHandler: function() { + this.form = this.element.form(); + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ) || []; + if ( !instances.length ) { + + // We don't use _on() here because we use a single event handler per form + this.form.on( "reset.ui-form-reset", this._formResetHandler ); + } + instances.push( this ); + this.form.data( "ui-form-reset-instances", instances ); + }, + + _unbindFormResetHandler: function() { + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ); + instances.splice( $.inArray( this, instances ), 1 ); + if ( instances.length ) { + this.form.data( "ui-form-reset-instances", instances ); + } else { + this.form + .removeData( "ui-form-reset-instances" ) + .off( "reset.ui-form-reset" ); + } + } +}; + + +/*! + * jQuery UI Support for jQuery core 1.7.x 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + */ + +//>>label: jQuery 1.7 Support +//>>group: Core +//>>description: Support version 1.7.x of jQuery core + + + +// Support: jQuery 1.7 only +// Not a great way to check versions, but since we only support 1.7+ and only +// need to detect <1.8, this is a simple check that should suffice. Checking +// for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0 +// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting +// 1.7 anymore). See #11197 for why we're not using feature detection. +if ( $.fn.jquery.substring( 0, 3 ) === "1.7" ) { + + // Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight() + // Unlike jQuery Core 1.8+, these only support numeric values to set the + // dimensions in pixels + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + } ); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each( function() { + $( this ).css( type, reduce( this, size ) + "px" ); + } ); + }; + + $.fn[ "outer" + name ] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each( function() { + $( this ).css( type, reduce( this, size, true, margin ) + "px" ); + } ); + }; + } ); + + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +; +/*! + * jQuery UI Keycode 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Keycode +//>>group: Core +//>>description: Provide keycodes as keynames +//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ + + +var keycode = $.ui.keyCode = { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 +}; + + + + +// Internal use only +var escapeSelector = $.ui.escapeSelector = ( function() { + var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g; + return function( selector ) { + return selector.replace( selectorEscape, "\\$1" ); + }; +} )(); + + +/*! + * jQuery UI Labels 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: labels +//>>group: Core +//>>description: Find all the labels associated with a given input +//>>docs: http://api.jqueryui.com/labels/ + + + +var labels = $.fn.labels = function() { + var ancestor, selector, id, labels, ancestors; + + // Check control.labels first + if ( this[ 0 ].labels && this[ 0 ].labels.length ) { + return this.pushStack( this[ 0 ].labels ); + } + + // Support: IE <= 11, FF <= 37, Android <= 2.3 only + // Above browsers do not support control.labels. Everything below is to support them + // as well as document fragments. control.labels does not work on document fragments + labels = this.eq( 0 ).parents( "label" ); + + // Look for the label based on the id + id = this.attr( "id" ); + if ( id ) { + + // We don't search against the document in case the element + // is disconnected from the DOM + ancestor = this.eq( 0 ).parents().last(); + + // Get a full set of top level ancestors + ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() ); + + // Create a selector for the label based on the id + selector = "label[for='" + $.ui.escapeSelector( id ) + "']"; + + labels = labels.add( ancestors.find( selector ).addBack( selector ) ); + + } + + // Return whatever we have found for labels + return this.pushStack( labels ); +}; + + +/*! + * jQuery UI Scroll Parent 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: scrollParent +//>>group: Core +//>>description: Get the closest ancestor element that is scrollable. +//>>docs: http://api.jqueryui.com/scrollParent/ + + + +var scrollParent = $.fn.scrollParent = function( includeHidden ) { + var position = this.css( "position" ), + excludeStaticParent = position === "absolute", + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents().filter( function() { + var parent = $( this ); + if ( excludeStaticParent && parent.css( "position" ) === "static" ) { + return false; + } + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + + parent.css( "overflow-x" ) ); + } ).eq( 0 ); + + return position === "fixed" || !scrollParent.length ? + $( this[ 0 ].ownerDocument || document ) : + scrollParent; +}; + + +/*! + * jQuery UI Tabbable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :tabbable Selector +//>>group: Core +//>>description: Selects elements which can be tabbed to. +//>>docs: http://api.jqueryui.com/tabbable-selector/ + + + +var tabbable = $.extend( $.expr[ ":" ], { + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + hasTabindex = tabIndex != null; + return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex ); + } +} ); + + +/*! + * jQuery UI Unique ID 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: uniqueId +//>>group: Core +//>>description: Functions to generate and remove uniqueId's +//>>docs: http://api.jqueryui.com/uniqueId/ + + + +var uniqueId = $.fn.extend( { + uniqueId: ( function() { + var uuid = 0; + + return function() { + return this.each( function() { + if ( !this.id ) { + this.id = "ui-id-" + ( ++uuid ); + } + } ); + }; + } )(), + + removeUniqueId: function() { + return this.each( function() { + if ( /^ui-id-\d+$/.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + } ); + } +} ); + + + + +// This file is deprecated +var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +/*! + * jQuery UI Mouse 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Mouse +//>>group: Widgets +//>>description: Abstracts mouse-based interactions to assist in creating certain widgets. +//>>docs: http://api.jqueryui.com/mouse/ + + + +var mouseHandled = false; +$( document ).on( "mouseup", function() { + mouseHandled = false; +} ); + +var widgetsMouse = $.widget( "ui.mouse", { + version: "1.12.1", + options: { + cancel: "input, textarea, button, select, option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .on( "mousedown." + this.widgetName, function( event ) { + return that._mouseDown( event ); + } ) + .on( "click." + this.widgetName, function( event ) { + if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) { + $.removeData( event.target, that.widgetName + ".preventClickEvent" ); + event.stopImmediatePropagation(); + return false; + } + } ); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.off( "." + this.widgetName ); + if ( this._mouseMoveDelegate ) { + this.document + .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); + } + }, + + _mouseDown: function( event ) { + + // don't let more than one widget handle mouseStart + if ( mouseHandled ) { + return; + } + + this._mouseMoved = false; + + // We may have missed mouseup (out of window) + ( this._mouseStarted && this._mouseUp( event ) ); + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = ( event.which === 1 ), + + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ? + $( event.target ).closest( this.options.cancel ).length : false ); + if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if ( !this.mouseDelayMet ) { + this._mouseDelayTimer = setTimeout( function() { + that.mouseDelayMet = true; + }, this.options.delay ); + } + + if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { + this._mouseStarted = ( this._mouseStart( event ) !== false ); + if ( !this._mouseStarted ) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) { + $.removeData( event.target, this.widgetName + ".preventClickEvent" ); + } + + // These delegates are required to keep context + this._mouseMoveDelegate = function( event ) { + return that._mouseMove( event ); + }; + this._mouseUpDelegate = function( event ) { + return that._mouseUp( event ); + }; + + this.document + .on( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .on( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function( event ) { + + // Only check for mouseups outside the document if you've moved inside the document + // at least once. This prevents the firing of mouseup in the case of IE<9, which will + // fire a mousemove event if content is placed under the cursor. See #7778 + // Support: IE <9 + if ( this._mouseMoved ) { + + // IE mouseup check - mouseup happened when mouse was out of window + if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && + !event.button ) { + return this._mouseUp( event ); + + // Iframe mouseup check - mouseup occurred in another document + } else if ( !event.which ) { + + // Support: Safari <=8 - 9 + // Safari sets which to 0 if you press any of the following keys + // during a drag (#14461) + if ( event.originalEvent.altKey || event.originalEvent.ctrlKey || + event.originalEvent.metaKey || event.originalEvent.shiftKey ) { + this.ignoreMissingWhich = true; + } else if ( !this.ignoreMissingWhich ) { + return this._mouseUp( event ); + } + } + } + + if ( event.which || event.button ) { + this._mouseMoved = true; + } + + if ( this._mouseStarted ) { + this._mouseDrag( event ); + return event.preventDefault(); + } + + if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { + this._mouseStarted = + ( this._mouseStart( this._mouseDownEvent, event ) !== false ); + ( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) ); + } + + return !this._mouseStarted; + }, + + _mouseUp: function( event ) { + this.document + .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + if ( this._mouseStarted ) { + this._mouseStarted = false; + + if ( event.target === this._mouseDownEvent.target ) { + $.data( event.target, this.widgetName + ".preventClickEvent", true ); + } + + this._mouseStop( event ); + } + + if ( this._mouseDelayTimer ) { + clearTimeout( this._mouseDelayTimer ); + delete this._mouseDelayTimer; + } + + this.ignoreMissingWhich = false; + mouseHandled = false; + event.preventDefault(); + }, + + _mouseDistanceMet: function( event ) { + return ( Math.max( + Math.abs( this._mouseDownEvent.pageX - event.pageX ), + Math.abs( this._mouseDownEvent.pageY - event.pageY ) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function( /* event */ ) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function( /* event */ ) {}, + _mouseDrag: function( /* event */ ) {}, + _mouseStop: function( /* event */ ) {}, + _mouseCapture: function( /* event */ ) { return true; } +} ); + + + + +// $.ui.plugin is deprecated. Use $.widget() extensions instead. +var plugin = $.ui.plugin = { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args, allowDisconnected ) { + var i, + set = instance.plugins[ name ]; + + if ( !set ) { + return; + } + + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || + instance.element[ 0 ].parentNode.nodeType === 11 ) ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } +}; + + + +var safeActiveElement = $.ui.safeActiveElement = function( document ) { + var activeElement; + + // Support: IE 9 only + // IE9 throws an "Unspecified error" accessing document.activeElement from an