From 512e30d49675188b722d25225b7e1aea7d1f9db9 Mon Sep 17 00:00:00 2001 From: ksjdragon Date: Mon, 1 Aug 2016 19:28:57 +0800 Subject: [PATCH 001/621] Initial commit --- hourglass/LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 hourglass/LICENSE diff --git a/hourglass/LICENSE b/hourglass/LICENSE new file mode 100644 index 0000000..9cecc1d --- /dev/null +++ b/hourglass/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + 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: + + {project} Copyright (C) {year} {fullname} + 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 +. From 763883cd134dbc15c77a4179b65957f867030e27 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Mon, 1 Aug 2016 19:30:32 +0800 Subject: [PATCH 002/621] Initial commit --- hourglass/.gitignore | 1 + hourglass/.meteor/.finished-upgraders | 14 ++++++ hourglass/.meteor/.gitignore | 1 + hourglass/.meteor/.id | 7 +++ hourglass/.meteor/packages | 21 ++++++++ hourglass/.meteor/platforms | 2 + hourglass/.meteor/release | 1 + hourglass/.meteor/versions | 69 +++++++++++++++++++++++++++ hourglass/README.md | 1 + hourglass/package.json | 10 ++++ hourglass/server/main.js | 5 ++ 11 files changed, 132 insertions(+) create mode 100644 hourglass/.gitignore create mode 100644 hourglass/.meteor/.finished-upgraders create mode 100644 hourglass/.meteor/.gitignore create mode 100644 hourglass/.meteor/.id create mode 100644 hourglass/.meteor/packages create mode 100644 hourglass/.meteor/platforms create mode 100644 hourglass/.meteor/release create mode 100644 hourglass/.meteor/versions create mode 100644 hourglass/README.md create mode 100644 hourglass/package.json create mode 100644 hourglass/server/main.js diff --git a/hourglass/.gitignore b/hourglass/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/hourglass/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/hourglass/.meteor/.finished-upgraders b/hourglass/.meteor/.finished-upgraders new file mode 100644 index 0000000..11fc14e --- /dev/null +++ b/hourglass/.meteor/.finished-upgraders @@ -0,0 +1,14 @@ +# This file contains information which helps Meteor properly upgrade your +# app when you run 'meteor update'. You should check it into version control +# with your project. + +notices-for-0.9.0 +notices-for-0.9.1 +0.9.4-platform-file +notices-for-facebook-graph-api-2 +1.2.0-standard-minifiers-package +1.2.0-meteor-platform-split +1.2.0-cordova-changes +1.2.0-breaking-changes +1.3.0-split-minifiers-package +1.4.0-remove-old-dev-bundle-link diff --git a/hourglass/.meteor/.gitignore b/hourglass/.meteor/.gitignore new file mode 100644 index 0000000..4083037 --- /dev/null +++ b/hourglass/.meteor/.gitignore @@ -0,0 +1 @@ +local diff --git a/hourglass/.meteor/.id b/hourglass/.meteor/.id new file mode 100644 index 0000000..b89577c --- /dev/null +++ b/hourglass/.meteor/.id @@ -0,0 +1,7 @@ +# This file contains a token that is unique to your project. +# Check it into your repository along with the rest of this directory. +# It can be used for purposes such as: +# - ensuring you don't accidentally deploy one app on top of another +# - providing package authors with aggregated statistics + +gqrxcygykwad5nac7m diff --git a/hourglass/.meteor/packages b/hourglass/.meteor/packages new file mode 100644 index 0000000..950fee4 --- /dev/null +++ b/hourglass/.meteor/packages @@ -0,0 +1,21 @@ +# Meteor packages used by this project, one per line. +# Check this file (and the other files in this directory) into your repository. +# +# 'meteor add' and 'meteor remove' will edit this file for you, +# but you can also edit it by hand. + +meteor-base@1.0.4 # Packages every Meteor app needs to have +mobile-experience@1.0.4 # Packages for a great mobile UX +mongo@1.1.10 # The database Meteor supports right now +blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views +reactive-var@1.0.10 # Reactive variable for tracker +jquery@1.11.9 # Helpful client-side library +tracker@1.1.0 # Meteor's client-side reactive programming library + +standard-minifier-css@1.1.8 # CSS minifier run for production mode +standard-minifier-js@1.1.8 # JS minifier run for production mode +es5-shim@4.6.13 # ECMAScript 5 compatibility for older browsers. +ecmascript@0.5.7 # Enable ECMAScript2015+ syntax in app code + +autopublish@1.0.7 # Publish all data to the clients (for prototyping) +insecure@1.0.7 # Allow all DB writes from clients (for prototyping) diff --git a/hourglass/.meteor/platforms b/hourglass/.meteor/platforms new file mode 100644 index 0000000..efeba1b --- /dev/null +++ b/hourglass/.meteor/platforms @@ -0,0 +1,2 @@ +server +browser diff --git a/hourglass/.meteor/release b/hourglass/.meteor/release new file mode 100644 index 0000000..c85944c --- /dev/null +++ b/hourglass/.meteor/release @@ -0,0 +1 @@ +METEOR@1.4.0.1 diff --git a/hourglass/.meteor/versions b/hourglass/.meteor/versions new file mode 100644 index 0000000..f72f2d9 --- /dev/null +++ b/hourglass/.meteor/versions @@ -0,0 +1,69 @@ +allow-deny@1.0.5 +autopublish@1.0.7 +autoupdate@1.2.11 +babel-compiler@6.9.0 +babel-runtime@0.1.10 +base64@1.0.9 +binary-heap@1.0.9 +blaze@2.1.8 +blaze-html-templates@1.0.4 +blaze-tools@1.0.9 +boilerplate-generator@1.0.9 +caching-compiler@1.0.6 +caching-html-compiler@1.0.6 +callback-hook@1.0.9 +check@1.2.3 +ddp@1.2.5 +ddp-client@1.2.9 +ddp-common@1.2.6 +ddp-server@1.2.10 +deps@1.0.12 +diff-sequence@1.0.6 +ecmascript@0.5.7 +ecmascript-runtime@0.3.12 +ejson@1.0.12 +es5-shim@4.6.13 +fastclick@1.0.12 +geojson-utils@1.0.9 +hot-code-push@1.0.4 +html-tools@1.0.10 +htmljs@1.0.10 +http@1.1.8 +id-map@1.0.8 +insecure@1.0.7 +jquery@1.11.9 +launch-screen@1.0.12 +livedata@1.0.18 +logging@1.1.14 +meteor@1.2.16 +meteor-base@1.0.4 +minifier-css@1.2.13 +minifier-js@1.2.13 +minimongo@1.0.17 +mobile-experience@1.0.4 +mobile-status-bar@1.0.12 +modules@0.7.5 +modules-runtime@0.7.5 +mongo@1.1.10 +mongo-id@1.0.5 +npm-mongo@1.5.45 +observe-sequence@1.0.12 +ordered-dict@1.0.8 +promise@0.8.3 +random@1.0.10 +reactive-var@1.0.10 +reload@1.1.10 +retry@1.0.8 +routepolicy@1.0.11 +spacebars@1.0.12 +spacebars-compiler@1.0.12 +standard-minifier-css@1.1.8 +standard-minifier-js@1.1.8 +templating@1.1.14 +templating-tools@1.0.4 +tracker@1.1.0 +ui@1.0.11 +underscore@1.0.9 +url@1.0.10 +webapp@1.3.10 +webapp-hashing@1.0.9 diff --git a/hourglass/README.md b/hourglass/README.md new file mode 100644 index 0000000..3a90fb4 --- /dev/null +++ b/hourglass/README.md @@ -0,0 +1 @@ +# Hourglass diff --git a/hourglass/package.json b/hourglass/package.json new file mode 100644 index 0000000..11efb34 --- /dev/null +++ b/hourglass/package.json @@ -0,0 +1,10 @@ +{ + "name": "Hourglass", + "private": true, + "scripts": { + "start": "meteor run" + }, + "dependencies": { + "meteor-node-stubs": "~0.2.0" + } +} diff --git a/hourglass/server/main.js b/hourglass/server/main.js new file mode 100644 index 0000000..31a9e0e --- /dev/null +++ b/hourglass/server/main.js @@ -0,0 +1,5 @@ +import { Meteor } from 'meteor/meteor'; + +Meteor.startup(() => { + // code to run on server at startup +}); From 177bb44a4468f531172ce2a1321005bb46b53705 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Mon, 1 Aug 2016 20:52:23 +0800 Subject: [PATCH 003/621] Added suggested array structure in comments --- hourglass/server/main.js | 78 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 31a9e0e..6013a28 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -1,5 +1,81 @@ import { Meteor } from 'meteor/meteor'; Meteor.startup(() => { - // code to run on server at startup + Meteor.methods({ + + }) }); + +/* Server Side Array V.1 + +School 1: +{ + Class A: (Ex: MYP Chemistry) { + Teacher A: (Ex: Mr. Bob) { + Homework 1: { (Ex: Finish polyatomic ions worksheet) + Due Date: (Ex: 8/9/2016 16:00 [Time can be blank]) + Aliases: { + (Ex: Polyatomic Ions WS, Do polyatomic ions) + } + Requirements: { [Can be blank] + (Ex: Questions 1-7) + } + Submitted: (Ex: beans.cool1337@bloomfield.org) [Person who submitted it] + Confirmations: { + (Ex: yang.eric@bloomfield.org, boberson.bob@bloomfield.org) + } + Reports: { + (Ex: moss.anthony@bloomfield.org) + } + Attachments: { + Doc 1: + (Ex: WS.doc, agarwal.arav@bloomfield.org) + } + Done: { + (Ex: qalieh.yaman@bloomfield.org) + } + } + + Homework 2: { + Due Date: + Aliases:{} + Requirements: {} + Submitted: + Confirmations: {} + Reports: {} + Attachments: {} + Done: {} + } + } + + Teacher B: { + Homework 1: { + Due Date: + Aliases:{} + Requirements: {} + Submitted: + Confirmations: {} + Reports: {} + Attachments: {} + Done: {} + } + } + } + + Class B: (Ex: Matematicas) { + Teacher A: { + Homework 1: { + Due Date: + Aliases:{} + Requirements: {} + Submitted: + Confirmations: {} + Reports: {} + Attachments: {} + Done: {} + } + } + } +} + +*/ From 75a40b47f48eaf146026461124d0faec0ab451c1 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Sat, 6 Aug 2016 13:02:00 -0400 Subject: [PATCH 004/621] Main layout for website --- hourglass/.meteor/packages | 3 +++ hourglass/.meteor/versions | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/hourglass/.meteor/packages b/hourglass/.meteor/packages index 950fee4..3825d99 100644 --- a/hourglass/.meteor/packages +++ b/hourglass/.meteor/packages @@ -19,3 +19,6 @@ ecmascript@0.5.7 # Enable ECMAScript2015+ syntax in app code autopublish@1.0.7 # Publish all data to the clients (for prototyping) insecure@1.0.7 # Allow all DB writes from clients (for prototyping) +fortawesome:fontawesome +session +proyk:meteor-cookies diff --git a/hourglass/.meteor/versions b/hourglass/.meteor/versions index f72f2d9..69248bc 100644 --- a/hourglass/.meteor/versions +++ b/hourglass/.meteor/versions @@ -24,6 +24,7 @@ ecmascript-runtime@0.3.12 ejson@1.0.12 es5-shim@4.6.13 fastclick@1.0.12 +fortawesome:fontawesome@4.5.0 geojson-utils@1.0.9 hot-code-push@1.0.4 html-tools@1.0.10 @@ -50,11 +51,14 @@ npm-mongo@1.5.45 observe-sequence@1.0.12 ordered-dict@1.0.8 promise@0.8.3 +proyk:meteor-cookies@0.0.1 random@1.0.10 +reactive-dict@1.1.8 reactive-var@1.0.10 reload@1.1.10 retry@1.0.8 routepolicy@1.0.11 +session@1.1.6 spacebars@1.0.12 spacebars-compiler@1.0.12 standard-minifier-css@1.1.8 From c864e11f704881a8da7df574f17f2f1995321ec1 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Sun, 7 Aug 2016 00:32:19 -0400 Subject: [PATCH 005/621] Added sidebar buttons --- hourglass/server/main.js | 77 ++-------------------------------------- 1 file changed, 2 insertions(+), 75 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 6013a28..6439838 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -1,81 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { Mongo } from 'meteor/mongo'; Meteor.startup(() => { Meteor.methods({ }) -}); - -/* Server Side Array V.1 - -School 1: -{ - Class A: (Ex: MYP Chemistry) { - Teacher A: (Ex: Mr. Bob) { - Homework 1: { (Ex: Finish polyatomic ions worksheet) - Due Date: (Ex: 8/9/2016 16:00 [Time can be blank]) - Aliases: { - (Ex: Polyatomic Ions WS, Do polyatomic ions) - } - Requirements: { [Can be blank] - (Ex: Questions 1-7) - } - Submitted: (Ex: beans.cool1337@bloomfield.org) [Person who submitted it] - Confirmations: { - (Ex: yang.eric@bloomfield.org, boberson.bob@bloomfield.org) - } - Reports: { - (Ex: moss.anthony@bloomfield.org) - } - Attachments: { - Doc 1: - (Ex: WS.doc, agarwal.arav@bloomfield.org) - } - Done: { - (Ex: qalieh.yaman@bloomfield.org) - } - } - - Homework 2: { - Due Date: - Aliases:{} - Requirements: {} - Submitted: - Confirmations: {} - Reports: {} - Attachments: {} - Done: {} - } - } - - Teacher B: { - Homework 1: { - Due Date: - Aliases:{} - Requirements: {} - Submitted: - Confirmations: {} - Reports: {} - Attachments: {} - Done: {} - } - } - } - - Class B: (Ex: Matematicas) { - Teacher A: { - Homework 1: { - Due Date: - Aliases:{} - Requirements: {} - Submitted: - Confirmations: {} - Reports: {} - Attachments: {} - Done: {} - } - } - } -} - -*/ +}); \ No newline at end of file From cb50268b23d0c47dfeddd7aad2b2bb73ab61a8d9 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Sun, 7 Aug 2016 12:42:35 -0400 Subject: [PATCH 006/621] Added favicon --- hourglass/public/favicon.ico | Bin 0 -> 114378 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 hourglass/public/favicon.ico diff --git a/hourglass/public/favicon.ico b/hourglass/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f899e24cfcd64b3e99fb922703239c2c193026e4 GIT binary patch literal 114378 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 literal 0 HcmV?d00001 From 17106ad3e7d9dae613b55981d712e93569a1faa8 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Sun, 7 Aug 2016 15:03:24 -0400 Subject: [PATCH 007/621] Added schemas for collections --- hourglass/.meteor/packages | 1 + hourglass/.meteor/versions | 2 ++ hourglass/server/main.js | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/hourglass/.meteor/packages b/hourglass/.meteor/packages index 3825d99..9e5042b 100644 --- a/hourglass/.meteor/packages +++ b/hourglass/.meteor/packages @@ -22,3 +22,4 @@ insecure@1.0.7 # Allow all DB writes from clients (for prototypin fortawesome:fontawesome session proyk:meteor-cookies +aldeed:simple-schema diff --git a/hourglass/.meteor/versions b/hourglass/.meteor/versions index 69248bc..bde488b 100644 --- a/hourglass/.meteor/versions +++ b/hourglass/.meteor/versions @@ -1,3 +1,4 @@ +aldeed:simple-schema@1.5.3 allow-deny@1.0.5 autopublish@1.0.7 autoupdate@1.2.11 @@ -36,6 +37,7 @@ jquery@1.11.9 launch-screen@1.0.12 livedata@1.0.18 logging@1.1.14 +mdg:validation-error@0.2.0 meteor@1.2.16 meteor-base@1.0.4 minifier-css@1.2.13 diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 6439838..c54a701 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -1,6 +1,42 @@ import { Meteor } from 'meteor/meteor'; import { Mongo } from 'meteor/mongo'; +schools = new Mongo.Collection("Schools"); +classes = new Mongo.Collection("Classes"); +homework = new Mongo.Collection("Homework"); + +schools.schema = new SimpleSchema({ + name: {type: String}, + aliases: {type: [String]} +}); + +classes.schema = new SimpleSchema({ + school: {type: String}, + //icon: {type: String}, + hour: {type: String}, + teacher: {type: String}, + name: {type: String, label: "Class Name"}, + status: {type: boolean, defaultValue: false}, + code: {type: String, optional: true}, + privacy: {type: String}, + category: {type: String}, + /*moderators: {type: [String]}, + banned: {type: [String]}, + blockEdit: {type: [String]}, + admin: {type: String}*/ +}); + +homework.schema = new SimpleSchema({ + class: {type: String}, + dueDate: {type: Date}, + aliases: {type: [String]}, + submittor: {type: String}, + confirmations: {type: [String]}, + reports: {type: [String], optional: true}, + attachments: {type: [String], optional: true}, + done: {type: [String], optional: true} +}); + Meteor.startup(() => { Meteor.methods({ From eed9a55a9074b292a5b40b6d4b21c1c5ae1d9866 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Sun, 7 Aug 2016 15:07:38 -0400 Subject: [PATCH 008/621] Minor syntax error --- hourglass/server/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index c54a701..ae11266 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -16,7 +16,7 @@ classes.schema = new SimpleSchema({ hour: {type: String}, teacher: {type: String}, name: {type: String, label: "Class Name"}, - status: {type: boolean, defaultValue: false}, + status: {type: Boolean, defaultValue: false}, code: {type: String, optional: true}, privacy: {type: String}, category: {type: String}, From d6e64f00a5a7476f0c87563556d627f0a44b8fd9 Mon Sep 17 00:00:00 2001 From: yamanq Date: Sun, 7 Aug 2016 15:21:39 -0400 Subject: [PATCH 009/621] server addition --- hourglass/server/main.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index ae11266..a8694fe 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -13,20 +13,20 @@ schools.schema = new SimpleSchema({ classes.schema = new SimpleSchema({ school: {type: String}, //icon: {type: String}, - hour: {type: String}, - teacher: {type: String}, name: {type: String, label: "Class Name"}, + hour: {type: String, optional: true}, + teacher: {type: String, optional: true}, status: {type: Boolean, defaultValue: false}, code: {type: String, optional: true}, privacy: {type: String}, category: {type: String}, - /*moderators: {type: [String]}, + moderators: {type: [String]}, banned: {type: [String]}, blockEdit: {type: [String]}, - admin: {type: String}*/ + admin: {type: String} }); -homework.schema = new SimpleSchema({ +work.schema = new SimpleSchema({ class: {type: String}, dueDate: {type: Date}, aliases: {type: [String]}, @@ -37,6 +37,13 @@ homework.schema = new SimpleSchema({ done: {type: [String], optional: true} }); +// Meteor.methods({ +// createClass: function(client) { +// if +// } + +// }); + Meteor.startup(() => { Meteor.methods({ From 0daf6ce48a223994c3cbe7ee0ad2921e1c920a27 Mon Sep 17 00:00:00 2001 From: yamanq Date: Sun, 7 Aug 2016 15:27:22 -0400 Subject: [PATCH 010/621] added some packages --- hourglass/.meteor/packages | 3 +++ hourglass/.meteor/versions | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/hourglass/.meteor/packages b/hourglass/.meteor/packages index 9e5042b..8ccfe16 100644 --- a/hourglass/.meteor/packages +++ b/hourglass/.meteor/packages @@ -23,3 +23,6 @@ fortawesome:fontawesome session proyk:meteor-cookies aldeed:simple-schema +accounts-google +accounts-ui +iron:router diff --git a/hourglass/.meteor/versions b/hourglass/.meteor/versions index bde488b..40bf955 100644 --- a/hourglass/.meteor/versions +++ b/hourglass/.meteor/versions @@ -1,3 +1,8 @@ +accounts-base@1.2.9 +accounts-google@1.0.10 +accounts-oauth@1.1.13 +accounts-ui@1.1.9 +accounts-ui-unstyled@1.1.12 aldeed:simple-schema@1.5.3 allow-deny@1.0.5 autopublish@1.0.7 @@ -17,6 +22,7 @@ check@1.2.3 ddp@1.2.5 ddp-client@1.2.9 ddp-common@1.2.6 +ddp-rate-limiter@1.0.5 ddp-server@1.2.10 deps@1.0.12 diff-sequence@1.0.6 @@ -27,15 +33,26 @@ es5-shim@4.6.13 fastclick@1.0.12 fortawesome:fontawesome@4.5.0 geojson-utils@1.0.9 +google@1.1.13 hot-code-push@1.0.4 html-tools@1.0.10 htmljs@1.0.10 http@1.1.8 id-map@1.0.8 insecure@1.0.7 +iron:controller@1.0.12 +iron:core@1.0.11 +iron:dynamic-template@1.0.12 +iron:layout@1.0.12 +iron:location@1.0.11 +iron:middleware-stack@1.1.0 +iron:router@1.0.13 +iron:url@1.0.11 jquery@1.11.9 launch-screen@1.0.12 +less@2.6.5 livedata@1.0.18 +localstorage@1.0.11 logging@1.1.14 mdg:validation-error@0.2.0 meteor@1.2.16 @@ -50,16 +67,20 @@ modules-runtime@0.7.5 mongo@1.1.10 mongo-id@1.0.5 npm-mongo@1.5.45 +oauth@1.1.11 +oauth2@1.1.10 observe-sequence@1.0.12 ordered-dict@1.0.8 promise@0.8.3 proyk:meteor-cookies@0.0.1 random@1.0.10 +rate-limit@1.0.5 reactive-dict@1.1.8 reactive-var@1.0.10 reload@1.1.10 retry@1.0.8 routepolicy@1.0.11 +service-configuration@1.0.10 session@1.1.6 spacebars@1.0.12 spacebars-compiler@1.0.12 From f03e93a818fa1926e7f0287c88a0ea207c25794d Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Sun, 7 Aug 2016 15:34:41 -0400 Subject: [PATCH 011/621] Fixed syntax errors --- hourglass/server/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index a8694fe..b6042bb 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -3,7 +3,7 @@ import { Mongo } from 'meteor/mongo'; schools = new Mongo.Collection("Schools"); classes = new Mongo.Collection("Classes"); -homework = new Mongo.Collection("Homework"); +work = new Mongo.Collection("Work"); schools.schema = new SimpleSchema({ name: {type: String}, From 5f705eeae36c0e0d294b8a6346254defdaf77a46 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Sun, 7 Aug 2016 19:01:27 -0400 Subject: [PATCH 012/621] Designed login page --- hourglass/public/favicon.ico | Bin 114378 -> 5430 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/hourglass/public/favicon.ico b/hourglass/public/favicon.ico index f899e24cfcd64b3e99fb922703239c2c193026e4..088b81411b53b5c36d690dec23f42f1de5a9ca52 100644 GIT binary patch delta 510 zcmX^0mu;JtDgy%}0~3RQ0Ekv#$Y5b$P-9?VP*8yIR{+KPSQsXTR>~i0)%ky+Pv`$d zBz(SC=l|Ir?f*cz$p_hGm34KE|7#c?0`dRfn5_T*))XBe*8P8Nl0H}rCVm*6953`ir%RJ literal 114378 zcmeEP2V9NaAHT}Viq{A)vK#k4ceMA;Oi?JLk`saq8FSfZm$pRh7f(%i(ZZw`S~H zz&#z@EG!tix)p~rtTBfZ94xlitioB~3=!am<2Q2WaQ3=a;i!WhqJj(K4%#<=6s3(S zqRLAM$BiAwJ8^CS51nVJ?D;%&W*!%<_t!j(!+b6N%)#0|u@gFdy1Gb!t}o_+qR{0i z0opjuwq&}y*08U|$LV5!bCbC{NA_KS7Ww+1C?8+s)jI;27|)IWR$LNaQ#iV}hG^?+ z4Xr~6D|J!q3r&%ieMRDvG&F=umaB`hAnrk=AzU0)(YQE1{^9T%qK&sSgzK;T)3_wQ zmX2SPK;$>~d*g4JKy8SfK&|;r zLAhWi<+!?tk9JP$g~s=D{zT$^E$xc>;k3BIDOpzL@hEUm5aiJtotg2azL!>qK_?3L$2$;DFk;oO$X`+h(d;MEJW1Y+ z&J~8;{#ALC{CPsp2o2FT7TrwVFdjgBp-b4W%%7BjE1aH#`9M++FqYv8rycv%dE@-? z59gyHT=kjc4`Zs5-<3DXpDUQ0sxC?gp4$(!k4^lY`I9ne2qFtLMRN;&citp_OXFTg zO$_Y!|Ec_!`tTn`jo{z--TCAErVQY3Iz5*{hi6jAzc01yca{O?wQdYmd;`Y7SgrD- zUj458aXzy=snpBRACvsgM^Gr(jlbhpmjS2m+=)LaVG8dv$s6mqFWx+!_p!UVz~@(% z0jC}5MO`Y@|BLg#x`;w^hf*hgRsJ|#Uq@(CUp5EM7r1!c_;qH%qx)jz8YI329~`ntaN?mHjGIs0LpbFj1$ zf*s~{dIrfb9tuakPA>Eq=x3Axr@<8lWa;Q9eU{`)=O-=$Yd)z4^GU394HACJ7!c>p zA)D7H?_>ipT@SC$Gd(x65a{XqWoI0wi7QHA^K%KH1v z;RLZ2OxO^uf~z2usmQ4O8VF(aQW>FQRYrX@M~EomhW#I@FkwktoQ^on&%sqn=Yl7BCfK<&_t$syoXR0 z?Q)9w%baa(ZEI@@`5VGLd5Emzk##hB-Auf0CA+3pmR%Ars`R=aS^K*P>uy-#H9(@W z=W}5^#DzYDn%k#OpWn{^xMHClT02-!_xDa?ts{zQkkBNq2T~_x(oe!bTxPwIsng5i zHAh1KMHc<*MstycK9wU72)Mrt({y7j0ar{L(P=uxYr14@x0IVW zEU7=N(`^9P0jnOOhI5gwh)UAe*N5GSKmQX5cs|1&xFu)iG5kw#C%Ce8vZjpZno{+( zwRcuqfI3K@&P6V^)El8t*yqnv&XfS-ps!8sUNVxw8q+VKS-h6d&#FS4zKh zt)0Xp@`CUJBMT`s-HnR`0{*HlUAn+-ROR_WTXeFsFn$v?av(Y}$3jAXX&R;b3)k`b z0*eROW_H^kG9fdp6PoGS7g-t_+||+1F|Rz7GbO=z2n3>4eBlJ-(me((@$rNG3p1L> zF>UO96^U8A#v-w^>I2u?HCTH&Jj)i%88!jg+irk4s~3WL4y|molk#9(_=3)N)dew# z(#}AxJ)+SHKOa~}F_F^GqM595N$3~*;r*ZEv#rsB5#vxV*pJcB%7lI9NW>SIoH8~x z{$u?eq4R4x#z&Js64uXQtpN5C1iG1YJ_ZIKAtjTNl* zxS_BiL8y1v&4{Z_)^a1?x9y zu)nqyjUO-%t@igu>0x$g|MXsH>8R1LzO)c^v)PWc^kMHoybq=Z=Si^A5QHLuP*%&jOK1$LU-7Ru+FeH|Fzo;xq*_%BJg!Jx-=hzNiDBUsEt1WS(#l(Dp~h_}^Qn z7%v{bSAn`H9_oNiA2DOSJjL*UhHwqYJlh*EzA*XTa{R$~iWoOd!32hn%f!4q`oUdv z0M>ekBanG8&G>iz3=9m6DM6>}8p7zWU|n_{Xb2-~RhV$xP1FwW8xMple|(P5Bz!3g9>9Q392{_XVR z@(<@Tc>D zHa>vIcYdP*xNC?u!THAS5Aj~YpDx$$${*t_6l%w63Z?+|zR=%^{@5PQ@1j{YALtJw z26i<-y=}CL{tfFovgQ8~JB(`uolJx|@slXD(w9O;x}wzocezjM3y%XtLSaPUKxY3V zCz3)wj#LTElg5!S|IfO%wqAE9YyQIn)0uOYHu#e56pVWg` zKM8!{(Vbtc3+n|W-v5IR{kwJ-6DnuNlrL$=dtVZM05j$f%qLJ^fB!$w4m7~Lm%k{) zosn~FTFWwD1pXM^n}W4ZLBRh5{V=xe;oOOOd~gP{2aIVZ`<;Y-Vkdec@JSa_!BrS1 z8T^~;0A#tcjut;IY6QdMgg&gZ>w)c#&DWqm40fYnPRL*MZ|)DF-H#k*PklH$PmDRx zB};30_KZ*p^|hg%0RPzk8+icwyY}Y#{KFf@mP4~_UC7w+m}sFF^oJsT9Ok2cTOGhy zCv?0se#@Z@>}6=B&xa5<(8-w@d=G0#59(jB@6W~up9AS(DZIO9niP9XQ>k+>OPDiI z653gG6Z)~f-k(BddV+t=J{Ud+1oOLMYCeegI_b#P zG7(K4I0Nkobb@*i(C0@(J$NuCqLxA(RI9Am!sMS01JTLAfqmh8(`;mH zoGiw=qI8pR(sxwoduUJ>*5-*Q&^;K9ckY4ov<15><2fjN?u{?>{$ymdOM0JAf+?X5 zbbQC}3wIXH7<>BeAHEaEGK(^hsqq##3pEh##8Z{(931eZHILu@uDWo8m_8`?7c`1# z$28IWjq8D!S-OOF=1w5F3rKWzeiWkkrl&B!Rfcwe*Yf#%tqpJ|k%bqFp7LlU?re<3 z_aF(ax}Yw~G>iEg*F%|fOYeQE z!5vVn$X!r1ehlLBy57Zn_a}LP$J1Bg^Yv5Vo~W3{vUrxzN9v)hFvLwtql8u#-5rH+ z{}n5^1FKF=f^&g?cFz!G-dGKuXNj6{UpW{Oy1u5D#+K0irA}yP=e9z@kW;s|MsR`lk_}7#m1*u^r#5xJfc4N#P#o;;%_5sFUQ_0{D@8wV-aQ{m; z1!Tc*KNpPqAReWIxRkR*X@Z$3;!f;XFUyVXU#6MY7isb!U0M+{*0FLzT&|$#PuzdR zb37d_ogi4_D5YTD8-x{hhdq7TOxze9!b{v4e>f*vMmWYz>POO&>NpR$a}fYz;(zrS z$v@G4<$20$0M`IK6;S#Ij~2kw1qjLN@Ynzo8Z>x%0HI*9o(U`b*iQ6(4hNnzfX52N z`b!Q6o-cq$4mccDtQU**j~tFUwi6w{mVoV`V~u&;0PFar1GbJ|K)^qu;};b0FQ3ka zc})S^i&fzt{EAiKAN=sE3iv0{gJ`S7UTn_Ti&YsNzq){bM3>|v&X43DEG`czr%d?? zT|j3LPL9w^>VfF2dZIHX^#}DzX9zl-QLs$?bKr;573*K%hW*O_;ddf}anvgKuQfKw zfASiT*MPhRO!h4^@}?R48wdD12Uwkhcg`Y*!h26bO$6`lW#hXO|D+xL zo5R}J*eL7hXeVO%KgpSg@OO1cJ+teb#)X9|!HoTu5;1>OhqE_~KhYT;C@T)hgVtGm zLCPn~12iwdSsn>5z*}y#nf0a{!Jo|!`vSSBw-xk(d_FSJ)B8`zem2jVnwmP`ag?P2 z58*e~aJ`Z`COkm!$2gV3gV;eY3&St5mWIRWu;Y+)={zvrth7ma*m3~75gx!g{eBzk z4L4anU}KKIbAs*J@C~UDS7zJ*axl@-(o&UOH~$qgjKzb1el)BH4;>FLAAgz;2sW%X zNpNIiTAumKuu@qd!JOp5;sLfF;RiPU7;pUj7zysgEYtpp48S}P2k(A%Hm2XWEPy(2 z_^;qCODDYfB>?)f^|g3t=?JDzC3P&TOL#zxKf#me5}d@?VRsyd@t0yv!sD~(Y(Lrf zv|XGR$(xjk;Lo&urrZ@B58yX0{T#W72V;KNYfZ#`p=`bUm+XdmdgGuUc<*e(LkB`Y zwnClb`XzNOt79y%8^N|r+yML1_%m`{g1y+E*zvhsVkWvIU7Qz$FI5gGAAZA>dB;@R z2b7Wl(9ZF@uH(7rAwTwhwb(-1n7LAOA%+ZRi7m2MW5G@X!u;N4re?G0vpzi!sOe5NwD}Fq7z# zGxvZk#-4>gKF3b;hJ-H|{MqReGr=CqC)zBQQAA$R_!I2e_=~Zpzi&5$i?jt?{4PQ^ z?)(0WSeHdJ?gO<%qIED2Mq_&8Z>$0j;I>8T8gv?8u}(0-ZW5e{nT0Ry2X?7^XU^|4 zcQF_^?)vXX14uTn11Q z{K3rh15%yc58(OUv;la%o9_1$VGXp=kJQ!wYg~Np56=e&cjuv_vzR)jamQ_tg*$PR z#hA+`H7JYByU=0@c`xpSsq~I0`sj0TSL5;AS?jv z|MO$M^7t3lK?J}9*?J-#iW<(;r=-3y{-DShO@h5xzJGx|tKXOMKxvF6@&M8x_xYq@ zW%9yu1=7Uj!FiX3e_1?mayAdacXjD8AI$fn;okFqdcId4_QW09hdYdq3wm4eP+G9G zzUexr@n`B^GM1xpk;;0EV_CQod}aOFVX;}(pBW!A*fTuG=CaPXj|3hl5b!OLz13_qYe*!~K4NF7#<-Qz~~YuLf{m3G=~h9?uBA6S084Q%h-QBFD~g zXx{K3_-?8_$O54RBMA@4;w{Eeg0-wan^$Da7krEz|)!BGU-mPTu0`|YUNC&?8WsUYsb3>t?vr%{Jo%H)Ql5$Ai zddY;oDje}BeIyc!{!?eV2wp#1$MZp08&2d=0+0b?nD^Di?H_-CivG3`=-76T zXTBp=>ibeOZycg=GBiqsH>tLxas8K|RinqF)afqp9+x@v;aU>ez~IhDR~G4^lXGlg zEa!n1cm<&mz1N`5R=bgoeg=G}PRwVrx;THj9PrkMCcKrxqeKW~)){y&jQ^9!|Ia4_ z^T9g0I=aj8-T;^H3HZYs5#l!g<#*UvSYi2q72qb)%S2Y@$;iWDBbqUI7TPw+3muwe zj}CnW!H{76I%VI5S7xNk6K@Gt=X#1Vbv(0+0S zNall-0muOO#)P>33BC+o_}eQi{LB0<)gh#*eF*6prlU?Ue#1PW1-zjl3CoWE6*JBs z=S7zz75LH{)_D2yGhII!cXo2PPsM#Jm+Axco*;uY#!41{;)dP7rU=gE#V7t{=zzb5 zU3(e!yQo=KFbYmzfgakM9i>@Tjh^#=1eK&6m}F%fL+1N0i44B#vx)GInVD znu1x-_I2fFy2?cB=Q}cYhjc*(z`7uR6tuqs<+N>#p)9^-xygnp&raeJ-Z%vOw+*oG ziRC_m??KAj{?CWI%oI(HOdat3aCoN|u(`iDX=o6Rk1o)Hhv9ocnh?$KuHnZ(z#m8+w3fjIg9`of{ zSXjvCd%qax@{)(KU@Mplz*tZOGGGeu0PMYfA?wS+knP6Cn{8%?VVOm{;H~ohFy9m4 z{ayK(uRL&mlRNak;`v}FXqW506aNa}PV*I>?}dWg*MT!#I@x%C`Ztj&&!(Ij!1FtSm*mseAly_YOhqzW@ctx;Z5pX ziZVf(!bRVKKO1khnJxD-;G4$dpzRCrdCo+8d;8{J}buKyMhdWb9j<* zfGnQaP87jcHVkpcI^(AyTn*pnu!gp;RRCvGR0mGl8JShI1b%}0QLHUakCpx@^gK$@-DD%&-Z4+m`@L%=aaw7T$us5#_+|qI??_UpeBSUTYF0lN&ER`9)A1Yg?PMy@@>~^M(2!9`#dB>A}?+@O8J2Q_$ zBOEAt{;wqzhC)UPKa`m~a;2*Qvi|4Zl|skD#ciMU_TSbC6pRHay#8}r{$^{XgYSn5 zBoyk=>;ERY6p9`#ehU<^$MT;jJQkSJk3x8CpaXlx^7CFlROOW>GM?|jx$S7YwmZ5v zh0ZSk{BgS%zwt_s0k9p^z90%YSkV1I0jvee-*l)nD1LuI$o_w4V+!qcX6wtXz?G46C9AeQ~K9nAQ>@3npuGKR4N#LWgi zkl*qDehB_pO!DmjU6}7J@+v*wBlA8o1|a-Ecp!T|g+@8j_#-{}H{1RghCh-qUeCv4 zKF{tHIx(AR`?5IGd>|eN%JM|QBnowcF$44;1$y#tHvR|{zdbIN*?@hvnI47Kj}gmx zf-}*@av#e8`Wq1JegNDq!&o8Em6;DhdWmocK>p3v-;U%z&rovz5BB%Q_My-PGT+1a z66}f2;sGN2$(R81L~00y9Ifd2;2XG0Apd6bKZoPD$AB?EegC(cDTQ_gu*P@<^9t%1 zfBdbd$l(;iV+dFi%7!&$`B?C`BUDexgV~p_v}=-5!wPq&-X8K3fie8RJY8 z84qAP84nzXvBMx3L*RGk;U1v;j6lWV`0XJ9e|P-7MQ2+IWrRxmbqSubZC@<^OW{xY z1TmjrzxDnU!ea^feDJqJTHy@I`#%O+6k6sD*n{lGZC-*cY18GnN#q0ze-ih61ck=H z+A%&e1mAOvmhTNz7?$4_5XR{Ad~ditg-*?t!Cj2KWX%WL%TnStUzXoaSUc`&Laz(T z=Yziu)rw^V{j!08669DJP-x3|DfYPivauxXne9f*rThpVfKJ@;+HsgWtOvkaGM*2D z43NM7S21{gX(%jUnEd_UiedDtLP6W7-~ZNv{o2`s@poFKZJWjz@G7Ot;E(+X&P1ofv)qZD=qKk; zXlM`SteB3L{LJ{T!nPvm!k8c4{}+C8?Lwi$aE_N?NOblb0MF+M-V%Snnc(_Q^iAU^ zWT8*r5%ESEJ8h|mMKm>QXjdUoq$`^1XZC#8h`A$2=n&8bg6TFEZu@k*a zcgO>$djaNy6Z!)FFy?@LrcLts;LpXj0;wrLyAS2VSlqi8bAFfLR!W!Q35g%eoy`;1 zG4EhMmcJwpi?6W%o~abFGh^n1c+I&2WtIo|Ni~4abisP;Z5tyB#Z8ov;WF5j*^b3n z5^PBr+_s6^w{$!ol;0itNr3)?WU#Eo?{naDy3+xtu%@gJRr4AvxFwvJ^0UUSCxiD5n>{~p|TqxB#XN9*u@L5P#^}(j?&$dJ&M=112Y%p7#(olf%fP=Z zKFfjm;FNwmB%pYBJ}AFC^mQozvG0HZ1M0z9?$vm{?dL=xd_I@7&r&=9ZJ6LK!4SIv zj+dkK0P9X@N5CL7-zx}tIjuomt#%^E&hcnm|0QUp-*}V~;*8GDw}5p-Ehc>#d2($L zBR6o`*Jv5Slmnah2J(=-1rM(Y6u_BLr+-YOJVLoO0OKlrrt5hZ*ndr&%wUW$kYLX; z)9zrux=4i1EigrC(|e<}{{Co^>q6AK%Qj?WydUwj55n6&@ctJ|33W4(rCAbkx8H!m zJZGUT6TQ%(ncZPO$q;x!K=T8Z^`!5>ynx3agwODNaIW<3P%`Wdv@4e&xkrU-0H5i? zcX)&_-wSbrcD#_Ob9O&X%$FDHqNCwmQT*hgXx7j$R@S)1=cT6!7q20VW6EeolE zjujhw;>PIk2CUXWq-T(Z?5q>esJ_e5V(-Z)DR2OsE3g8-5{h{N@CSaNc>?nV@WY{* z6dKqC`T;mAW?&#cD^_8UzY>srhbIlr;}Wb%JEvtk^xsK={ZXL%Jk+yOJTfp$MO>LS zPOvSFwUigs;O$>^P*|5LhED`KnaJEE8M)eRL=j%o(7_o!Xg;820L=rK7Z`q6J&K2n zb)X;MQ`vg*yF*_=_S;@~z6b3;8}GN`J3M%QPa^k0_Fjq7Mae-fH13@&_aIGZw+wcq zont%OO#In8TNV%=z;Q~4A$Gn_2I|vw3yK;!1s$H*jl~BH51g6DL%xnYI4j1(--(kn2UA+J`m6{;3~+0xQRSuYee@0_wm@JEZXF5 zU#|f&-!q4O*7g2)+>P72Hr&bRjY463*4=ss-A_w#X7HC{FXe|XWdg>tw0~*ri66n6 zt>d^-yGZu{>fe1MTJAdz-WBNtW#prr2p+6WGxI?_c9HK7ejRIBU-liIaeXLscAgeW z4|PPdhJ>LWwu$ukT`JcxRs=87P8q#yOiPC$a{b%77;|B1{0T2;>!qQAcI(iJQDb19 zX^Zy3S)^W;JcQ4q<1vgZjdFYWHGub1q5T(hHWHL98|i@N3=2jMw()>F#(-eW^xI#< ztu+4Mi#v%&@CRKeHnZda%?H8^g!#bTJ{qm^8-+p!S|M!#Jr0nc6)PX^Qa*UThwt$4 z;2WOC`hLZB)^R12b_U>1aQK=|ctbkBFC7o#_ORNrQ@(L{U-J@7!%AT zI^aw&$8H#RqUbPUyGZJ;&W}J`o{{|SP}y*oa>aLe;Eld)9;J^o1hd3#ij7}+_M0AHWNN!;U-C&?Z!3({vFwN z8FNQry4XJzX;9-3mn(pEL4G10m_akzF=ecC8lc7o*9M1G5+6f|4f{Y!Zf7L4+Z>n zCXv9MBdYO%m-{m>K(hW&Eha5uBTahpX-*4%BzA%WQ$9#jJ&i9D%VdFr|Wnf3ztpryR_G>!9wTv({KM?=YxD%|U z7?&Q~G5)yUV&nq5y-Uo3G}I9*7ze2FS0hcXEnX8U09C2>2fv2z*ZjVPwX8qB!vk|6 znD1G@xM*1!*b^)Ot5VpIIhU9xzS@qFlR z{xkS@6zoUp)FhArLQq`%wqOg{`uS7#uVMT(zkgC*JpaY}qC6fSWT79_HO%)UGWTnk zG1!xF7gP5ne0g{>Se8zogk{<><0r+nG^V&+6NT}Wk?RsZ!R`cqRv1aU$8KU7fZh19 zNQ2u8%YYICJ%h>rr2c+&*s^dg%k6v1fn^@v7v=K0!F+GM7<*j*(t2hvVPtA)cWD@m zg)|&-m)3phcm#84IP6dGl!leM(Rhi=#F)kH7vsoQf>e<0Sh3tCcH&3${o=4#282OB zpj#>T2H1GB&EJbTi6`0LgY|GO55B`nO@OiAB(a(ZI#$Ha*2{7)D?D){Iy(()Chl05 zwTt~I(6Pc{iCI<$KlO6LV0WT$e8xNh^wLU$=MDH9;ywT?KT=1PL1$ymHveeZK<=yJ zejo3L;PpP-2b8I}j2{7)A2KcIeM& zcU&e+50f4VOY+x}#3l5SbhRKJq*H0ye_42!<@UY2U}*5}WT zR~FV~x&7>X<>~$T8u%K{U-SF(C6|}rM{A%W_*Nv$kCsCo|IgGwMX;?%m_Ji`d9FWN z0~NuxB4K{C9P;>orUo#!6;Xetbn;w(MGc@I{}q#RnKNm9%l=U&yu=>F#Q#kE#dbvO zj5qqi9?S%&Lj1*cMPkon{AKMmh<`rgFR{O5?8?Mn)-EPcmH3P8=EN>0NY)-i{KW)H z>|%n5Hz81J55@(OkcSX$mym-{Cia)LOUOYeAN#ZHG(i&b5Tfm>()?(GWbNisf0{s+ zohB$q>Mv`j36y%%1hUAX36iz5$e{@=We0*-|U{blVyAln-VEJY3wC~Gf84iG3~&o4y|5Lk*FAV}7(S~~w?S-bhy{a?z2mrehR z^2n4=w*0{|^vKdLTR$@OCtJU=c3FG?&r$@+;tTvxia=TZ_!d89mTF!!zm_5}xK#7} zlD|3dV*vou)g4?rGn-Zms6EfX2FAyVy7aBZILDrzU>2z;(=) zVH{3tPFEYt-jh~8J1}`it4mANij7y~1zc|sKCtzK6AJCyv>zfIrXA-pUqyXcYMR}$ z;hIL9JvVQN9j@8YbLoq<3zl!$@@V8v&nNS1)fDs zr8ZUmvdSHho;LjRz9OD}Uc;w3g||LwtaS@~KlE1G3PEG$UiIo9L|1i|8w_e&JvG#;dX4kOfhPME6(2RzuXpq9M=Otu z<7b3~;3C9q(|lW0v?0NJ8h`x24LOfvGBQ*Z6+<~q4;;9AE+@xwV4tQw&F4Az>h%ac zI7$WT;pRch-ZqaOKer8XSAAk%sfH?0B8N^E1ZssoMX>9G4{u*xBt7Xo7Z*0-VUvs z*Y(U*=Gg5#z?rjhN${MI>K3-2rwt!hNZd~w)dldlCim2#?@GU)5c!MMLqVL&vY3V`ZlR!s>8^4 z(V1SHi$2*~7JY77x8``q^9yH%1lD`pulM553r=rw%&Wfqynj&g%wW?xbv&MV+HE~- zIQGG#02jsLQ~M9jZgfsjq2W1UtV+K-r*4Gaf4l3{tw^&|r%u_sPG5H& z6~8rSLtBO2HD?@74r`qkd!X&SF)dQw*le-QG)%hP@_tNF*uCB*B{QD7r?nfl;G|sv zw^hpvfek#B;+~J_g8G%TeKDX# znrWn;tE%j=xuJ^ElJ&fZ0O_Ux}EhI5KJTvs=UT)^+dexa2})NtbSF z1C4LRdUKT`on19E4{HvwT;gnWJg;5TKKoAuM{3xPNL{~0Cv8lJIkmDH&3Zb~aoR$w z)_q283%+2g9+clmVWCFPrNisycSzW|_RVNNo|3uns6lX{YSHBCZc0mP`Q*ObV$%N9 zy_*zt#)m4_f+&reJ?M+X;r*@i`&k477D;gN0rEFm`H?q+Z4X%^Gtliz{wX4;xERKy< z%9!fFzf+VgdN=E)VSr_Ek1bLCXB*ruZYaDg+zel+Z87cb`TaMmy^QNQSYJ(LMQ*oD z&&f(PmapS)a>=SywM{bj9zR}P@qO1bZFYzZkt! z>DAaZ3H=uB>+`CA6;bc^)?0S2c$0DJP=txe=6G{q^~RZlBTScmTIjAg$ac%SBd6V; znRHz0%-eXNN$8lu1IgE4`|2yD&8YHfYSO;5Bj;#wT=(T)U*bKxbDO38O=`cYrIqMb z_2P`GlMCK>*9f}%c#h49hU-7RzuMrkASf}VbwJ2`=PNpCPCb*fP)cN$Z=7R((+}Z) z3H#(Xp7}iYWaCy!>wDhGUOz*Hcd+T<(EBp)=CENOje1`_TiC5uvuex7w{uyo z8fDX%@^XgTBZ*uSzaY*oJam;2*)xz*g_A6DmN zcxyfj(}=Xcc`)eHXLGk;QMhO;=f(b~{B4@4?~1}-4%srex$=Uoo%ud(E!rLrY1X6d zF3qcldOKfDeP+?b?}PX81}o;iNKy(2Ing-0R#H)&NLAJTR{Xs8P2EkJjH%m2#Uvu; z*rvhL{gSuu@mR;%t4r^ggmp;E{xZXBYbh9(ypf*n3j7x}2xhGaepR=^C5h zlHz&XeQ>;oohFClk}_r}kK5Jn$|2W54UZjbBZ%35%B@Yz&?RehH?-GnJ7moqyPCp_ zTEndJ2m92mrhclV^U^hTJqIptlaS$ZBftNWz>)hChxSpLoOf~mn5X)@A?L@QaGZak zug6)F`9`{D!*hFdYj*OLo5$Y|>=yQpnK!9-hGj|S$s<*TE8h-yvEJX+%3M)7thwTy z3ssiujQH!Q*3ozcPViQzh;y1rmcvZW_4dj?-eG4q`!<|ieqOGc8ob%=ihs{K*W~lw zBn8(rUaOfZ@%JX{JX>@9^1Ix=w{DGnsye2?y3xFcE$>abS=g%c$SbK29QE7ick1f3 zNwxo;!$*T2nI^v&SW;ki{EgScPo{B#X*~;+o)sR+J7qm%*;Rc7lagn<2Vef6IM}s{ z$*X&d&M)f0ds{2vrRNr{Hr2))+&L}fzLur_(DO|$xHfCrreogL7CSXoEcX{SInc55 z=JV&??7rYU@%i3|y^^cy&eSQia=B@3nriE)b(bR2WC ziwUpSZU?=_dl$|}t=oQl^4Wdc5S?hdSJ=0EBwN%`S_t&)SyKrmnW{WXd=RUN}tuilp`O6(I zjk_wHUS;g}=*&FJd6TPgIAb544hixN{9DtftN*>xk;@Xg<+>@=KR(C7z`V2Oi?nsS zqns}|)lBhJ@_F~+eF{f8r*op~>HBJp_fFUuWuCCz!|M8qOU*ado3w7o@(Yn;hTd)x znf`QFo&24DpYJ(%`Dp7yHDh_Li%uWvH}%++jcSKln=~Ey_R#eeCX=-S-`-W7Kl!P0 zop*&tc};jOnW3SfU28UT{_F0kHJzvtITJeHOmTCG|9s;}PW?>_=Q!5%80M^@7CLdg z)Ggdu1);?$pMhDCpgjOZN{rsJF71KCfYYwGvUsc;#V9 zxsyu#r}r%OqGY@-=*A%`t*5iZmaNz zb?>FkT(@?SVC?0^ssp<2d7FF1&1-qq=9(KHIW+DzC9p}Wt2cSdx^4?yI^2GBOjU3> zZ=E`)hIzC0Av=~TajiEEJ|A+UVWi6yhwE*28hi9L5N>#S^~v$H-I~=ksHH*alWad& zMfM6AjZZeJ8hO%V zP?P?LlP+usYw@-XXKNpo4sCst8b=%{vM%bXcd%h_x7C}b_1JuIOq-&THu2BbK?wjY@t;<}^5lHpBOX;;w-iMZ3d!|tuxx3@e!)1+vBVU;>NuV0wi;_;IC zt|~99b=QkI%2ONRzhIK;9Su&W>+fH?CDyrT(BFQ(r?8PN_l06@72drN%T@f>ZL5CVZNI3;(4n^K zt9_OIM=Z*}WMeetoT|XfVM?26TAhArORvtX z*YWj9PRixsqnxX@_fDLXb(H6I-}7m*Pj~g4daC2r_k4P?r|pFY&2GGEcDEp7_{79I z&xU4Aqize{eO8^fo@2&2)?%z(qrP)S9Gqn}zeTf&aI5jTl!7ydvX5&wd;DN-kewH=?ucgd()nR z{{ELz#@naGew>p2!m?N;v60K#`2iiX!)o~@y?E@Lp$R#M;hZDPKB$j3((`}a{P3O_ z3!Y<-jqP$y9~jyFl&G|V(mO=K7ualD~>=CS)mwf(N29rnQXY@yT0 z)NV;1qjGBuc(*gyyDN_QL$Ds&NKHumZfNJIWl+f%a=|O zC*CODzZIf9Xln88#*ylodAhn2Mh@6{$@oR_h@GERrvuehi*8MfPV_#Q%USES&5IgT z&B(D$mm!l2k2gO2=DH|8KGV9(jo?X~F(xsW-CIB2(OfGiz0UqN?`$^qm|N0LCu-tJ ztAu5V$J=RiaTpdgL$D&K&2-H+vo-3fHovD^UAXD8QQw5@LoHS%UHR*2UDw;n&!QVH z+mqMXrWZ%G3U`1Yr=9B{Ct=8?rg=(<`wE-fZSFtR)+%1%^ofh_qxxA~{aox=(#T`Y z>3G#PYPZ5>s(NWZcy?j##&*v?cI$FyYyEj1i&M8)THl#;&F{eR#B27sN>f{BeQ=F> zsMt>R`IE`3Uf<-@%&0qlZ`zfMTRX4M->^is6as!Q; zDIX7{Z0_W$WH@Y7TGpi6HlllN&nrA^W4-Ct?Bulg4#znc$DTMjp-<*~2?0WgrUBQ=bsPXwsY6k9osgwSv&RhY|l^TZRaQyhr8?= z(zVdhG&?Ny;k2Xz3Jm3``5V|^0F%JKM)k6P9N+(_ zwa4<=POdI@OzXeD5p#5HL&4#k=uZW&cCQ`5-(IUl&<%g};zwJ|KSnAXOnJDr#1Gb8 z;-aq<6|DJuQRQ>B!nOX@7L3reyPl%dsCu6*+gDQQnSDI>A6MGjLM<|@#l|=5V+`CZ zxsB!i~H=VTe!ku+Xdk$C|z1U#hm6_e!)Jo~REuXV$R>Ukh)pwx;IZ5ytLd>eWLT}^CbJ7C*1dYUX8Tjy z1N^KSg&e(d;=-I=kGyQ#4n5iR`r`AmcNPpgpPOJR+@qZC)%o0x0UlM;R|*Qx6(>3@oM|}^Jnp|wzP)bI*(00nmA#HNd6|uBHNCOv*lPWPG_9QMV>XjrR2wGeP53); z+AG^!QDF0zOERi&KCD|qZC3SV2TH1&WxQTy@cP{>%Nv)h51b2l-M#hJ!xJ7S>?nEC zZ)5eTb$n-ZeU*HCN6kIF)aOf1jBaCNLS>s3|24RKhyI*%h5f6(e>LGsU`9mo{aZd3 zjn0{mZ*uu`M%|1xB9*_7_L!GFL-FPDyef$%@ztDQ!D`32$5F4%g6tO8C{!B#`TfJO z$==iFPj;`y|Ioit!u}d9n%fOJy2LMI`rN*s|8lxDsYT<7+O-FC;3~IKxNW03xM*6f z^Gj9UOy{-*>b;tJa>2XHxiz~v-f!c}NiPhUxskicJTP+6%sR(U96hKpJb%-B_aln2{7i4p zSGw_oJUj%WQ66VN-)*tuPVYQ+`+T0MA2?)`Nm7_wuCJ15h|u8ika*()J(JN#+s6N`-*ve8 zoN4y8VnzfnTgx&196fG&HnjAXCqqjb9apkcNciL)qJ5$5?h}f_lhIY`8FbXyH{s1G z1Hbp#qM@hWaD0|;@9z?>AY8X}+I~yU&V^ImuBJuix+r)b99t)4ZgfWd=aE*8l~ZbU zv9NBq%0l;Ht+dzYz1z>dWoM-H^z4Dg%F*LRm+esXvW{K9Ig>@CQnwUEnK3F&1WsITw{?^CmEQr*8f1%m-3mXbw zSt}h`S4%_B^V95-l}c*)?+o3u+6^B#?|#FGi{2WRw~aODHZ&>G_PFM->u>cA8PWCb z-=5a3PS@IQZ(DkNu4}FQcJt-N4_g=;1pj@@W%gL-8#B5VB=m0fGUbz=a(>b5*q%wI zHC#Ra{j`8%RH|g z-kQIyx>Y;nuGtHpbm`exQ2e5LenN(V{--A$297?sKBM?nQF_Tl)k1yEtNI{`7Z>j~ zFR7mBvh&7-dC}Exd?*OndaOzxQ=M%67Un7nXPaLQL6b1yxTfwy47EzbCxp!v{OJv+2$D zJsZHeq)}&!BWE>lpxcLKldHzQD>#_+beYHHC+?nEg(^{*E4YH_YPv_PR_(nJe*diV z=@X_iYIQQ(dvlWcvW!O6>+0`~*`Bx2H^r-|e%)2W-DVv-n_ersrN2+}J$IWIHSaul zem6r-aAu;QhUv>7MgEfhu4tj<NQsnczWA4FetwNlrh&1+F7RDJ-8*VRUP}a zA-*8YKQw#u>du};J15*(I4R?WNO?=$3E45-w#|3C+o!R%I%mfd%a=|;v6Jhx%{sY+ zdn&-#N?mzO)rFI*w9bEmsu?`ZDqeVVZjU9}H+^T+pAoXHd5h+mO6`{W`#kczoZ!3s z)7dGjclmc%aHE(v<-^{Qb?O?dnLc%wvcJ{LH#KLLoQ?ey?Ak2s*4C@zpSAEYdp|Ya zcu6KDyEdVPf2~K|k;5 zxz65@=Q{IjN#Yi_5y#N;rnj6LaL&y$uUDX|U&F6Q^jsB()$?^bx0rQi%`KNOr#_E8 zdU;szkL%4kZ20qVTZySB!L2BNoS+mUU zM6b_p7o#5B;HZAat24f*mI{o!O?+!tJ^kaA%sq?l%w40DZ8m+(nOeO?bzWWyQ#ez% z`rw?F0nSyHi*~3CFPK_mxbNgqX$k@xm$w@Qs&GxxdL>d{-yB!CqT@n@?-udpOo874;4of0eXEn=>KKrI0C#41@d{m>=#{nLPoUY$1 zes%ZNjj`EFipGcaYV{~EGiyfe$sU&u%K+C@Bc`O?;$rOf^WM)s#oc_XploRv)YILT!k4&KSkO2WpuX(a)V))_0uR zV#cBYFZMXsso5s^W0p$Ib$$DEQr{bXXy566`|CB(8-MinV~x&tm#kG9eZbN3^423O zHgL1+#O#`odqiQ1yW682L$kVD)^#78d*R_Zj=-#*Pf&*(72Dz>)j0}R9VXqGo%c}i z{PHEBzK817uWQ~L4oVmxbX2e9VeSc|=xf6R zUqlC+8n0hf5XZS$@ThM4i=-f z#3!e^+ho2-4sM*$_wwrgOIO>(MA>%SM$JrovfOM@!C#81??coxjrJWq6W9IFCe3IP)pf*suL5&7sNGIRU-bUWGk!gL=SkJJkeld5%V*TIkz`YAIiHTdY&@Dqz-r>=iE z@a3zXjWPp|DhCxSuGAV@YskBSt!`A~r5N|?-Sv5|ju$yPHj$5av{j8vtE!?WY}>VS z``u3h(k&Ww_I!|I*nY^m{sB!RGJ~V0SsAUruREl@NAGTX>x8=w$ZEPQ?@G>qIYT}< zo?DeYJp1|M*l5kmhy&t4F*tVZlsU`$9pI!DHr?Uh zeosyvt6hgZ&kTJQQa^a)jL-%Pd;=ZgQ=RoX6&gp7vjFM6C%ahfpz;r?*L~ObhJV0B zg>0k~Cs=OwX`}L_mDSqKUeBpl-@e&nh_vxu8 z)uS9=Dl8xKruT~O{H&w5YQ=dN&sa3M#o3kJy|Nz1Y>Yp?Xv&N9#kn32dmR_WwNkhh zWF675t;x$wzd7&BE!1n}b8hQrd`_Cbb#V2JlD}TQb{e*D;hp#GTc5ws-EPh6B1gg1 z1ch;Yy|Ftk^mp#))33(+g|Pka@^1HEp*|-&Oj~d}G+upKK(%M#Hp)pa)^={Ku-8|i zZ{DJo0fi}J&Cd>|iWlQ7?!>Ry9clZadjaQG(BHc{MxWgocPYf@a=$J%k)o2eaUTqW zw`nd63?GpZ-@41Lx>n6Mn`E47T|Z_2v{cVdA4YgzGYGoWeDAR<9ru`qo~yR>mSUY} z7YFv~b2}FGURr1rN#~G|`oBWHGN{e2>pBSpr??g`6nBcdmO?4+65QQA1b4U#6pFh` zp|}O7NTE=qxVux_-t?L8|Mw>|naOo>&OU4V+En&n4dxby}+wQJBC zd&G+^aw=K5+UTD*(+-}c`k`NZx(lxW3B*tNv-HW*nk#yM@Yd(LySjB>LJ?)NSNK!`XTS;(j_m7|O8CN1o@=n%Hp9x? zZ3auGse++1^8sG7D09djn1%?uI7wP5ZaVc3_EqX6Y+X9sgND`>GiRGoL-wGx-(08& zT{7T&qTLx#8Em=>(rt11WfHd+%6_YhKo5=C&n4f*hAQ|)JN(o!LDR54k1j8(b;|bQ zBQ17@=TET=!~PZkI>UdHKW;<&kF4kBxB*zFz&#c?D5wEY$#}L>|ASn#MZ%rCY-Tl4@OljWWa?*YSdu)HL$+25ML3TC_ysi8*Kyvj zPm9Z4*4*VIKhR&dikmQ_&hr%R_iFTILhCp zY*#5|#;mXu6Oz%&nkE-e{RCb}7eL__2H6+4pWh*(slW$Ma-1YLFi|R;h|c;U?+l*E z9X%`zL5~mr21TQFGhaPNBFBIPkOU(Vx8IsRy*_n;cj7h~pIJE?p;LFObrk9h-6qi;-nljJ}W z>7u?VPPZ5a-3+cJS2trDs1{EDf7W+x6)qEE-Xw>?Q3w++gM72>U7J7vv6?&?haW`d z&3K`+ENNAbi8SDP2pdm^iTVQcF>#jyLWvb6wI58IE}smMwYm2&63eEhEI*=ycJMkH zfIjOh9zp$&cbF#>=aD-9(;M0_OkyLScoHvtPtLlhaax9^V-|_m{9}q7PYx1W36*@5 zq^uYQ4xJ_tdS9Gg$@wd$hTH#a*JwiH)G@vxvc4N$)ruQy00E;)zr^$AjT3eLkQNsR zfn(fW@0ay%(cdC9B$9+|R6f+-kGj%j5=G+wPLr;d%r*^3C=Z8I<4(ZU{6~n&RAV8G z`DwSgEb5&7sBa2<4l*X~N1*~aYSMKz_M(?#yaQJf{Rr1e8?l=kEKc&DCk|5P z?A!7hhrK%Dv-HE`67WX~Bk-Hsyl<@z_EI>zR1v>HHnS#TV8xdoW72o`APRMP$muJ{ zk8FsOW-@|N!Tshc3PT=O4oCq*^uNC9xi~?sgFy$cbXmCc92#?eky* zzE^j~23E*eV?z2q&d;5zUL;^GsaXI+nsBNnFnobKh=G_;MoT-Qp#CA?5(m*l^ns?w2 zuS&2$dCYQ0K1$O;|NSSr{d@ZQftU5x;-5qZ5H6q07ogZGcKK%Vgi`;IlUt;r^3Hq4 zF9@dc>f_JZhT=;@QCwPPxPug4>{aonwpl145}ss!G-mGK(>mTtjPCpGz=3<}g8!{1 zcJl}m_H-1v?!q?qGBGUb8%KwD0zA#`7!*z!|E6F8ZPk(nuzpNENJ+_lqf_g|x+EQ2 z7}ZC%_}F>Jvsa8-|G+dIK)LX5t-<>3(MyaTl3*kUBWmxKZ#M_C)&s(I|CwIk$%&Jd z^*`0;MyY$6jsRL%q`p04tYb%Q9EdBOA_^GMoHWW``E0wzGGWP5YJf;VKR+{lT-m%6 zs>ynPN!zm8pX6DFe(|HgD61sFCFG7NpX_Ds5ip-RHkv7hBNyI(bvjNe(zd%Z4Db>L z`A62z6#$rTRBR1%-5gx+@;_ysec_Ts zYzfE~nG@vr@aF8|GY1E1|Bo+mfM^%Y(9=Pb{&@*(D!1uaJu4ccQ4|a&lRSIkqUW=w zkMNOPgWvEtyG!9X}RiFAG3h+4(f*ji0ZCe(Zj9q96ht{UPlmv+9mCK9+Y~JO+0a)rf$2>Lg zqufh=dI6w?o|BKIBO>Ikhvn|zJ-Aph>{Bd4UzCgd_oE562^Xc4w*NU(?eS{KE`=831bxLrMxX#4uj>PlGlzY)78Sl&3 zc6I@oFRO#-{R=eARIp+qAf-8UP6tpc5q|5La>t;QMz}5!hlmYK;~11IvLr7+vtk%Q zmkfZ7U!~>kuC58BpAoRpNvO~3@`OpP$2*z@*SW1 z{n8~HDQHs_@~oJBfA)vqdsFD6g9KK#X_*-F`z*OKM6U3T2_Ya!u@XKTeV-OlQ3m5E)14z|KQgiQ|b1wY-7dH|?K$8f_+s1nF13Fd>wu z5a7M~gh_e-3E;E)b`mpjemIDEG_#i$z z&)tSe8P#-*_1zg87MG84M64+;15Ad+Cg#I?omgt zGX>Y}-?e0?zm(=8x)6ova={s0X&_}oH&CylxwBk z&c+}-1cc|Gf(gK=gor12D15inTxAB4MZK-RipO~x0}MWKg)H^wY3Z|BjGs!LI*;)n zb^C86n>{Iz#ehgHeICz;-lqYPfIimPXG5h%z$A7gD@1Eco2CTa_aPI0k=w%yv(E9I z4e8E+JtZInL2LChE8`<(M6ox_+Y!m4##sx6M;pF_y=4W^^`iEHl;)_&-VSh{u*?P% zB9N&T)qc_z%fftZigLOF(!YBRAf6aH-NI@z%VV#FKHnNR#%8$ofMY)_IH&ykc?=kn z`0*V;3A5&o=ZK+KyE*z8OVr?z&INcSm z?$!jDz2Y$S>El!9t^eAu7c>bPpY4&u$@8f20*=y2 z*f|K!T$<%Kd2j3jL4cTP2=T4pL^LF1HwfeJ>5q{x+RBHHZf;7Fz6g^v%T5I`gv7RQ zw>g6|c5dF+cN`}o^qgiI>S_b^767oGjznNhWD1-aP8QaW5OkjP<>K( zZqV_kRs@k;(&L2@)Y5cNfU>#70^zV^1*X?CkzOHCj0G8Acn8Rf^)*xk4rvrU`N3O? z?dnPLYin^<9|r|u@JW&WVSV#!Wv!`RFD4)X)x~x>50w9*=0%Zc6C-95Nmj9=&T3rh zz_lj?;iU^H44Ryxdp}9ag}ttTG7Af#d7yt|t%R0y@wm9S;0i4Jn4g2>g%Bbd(5-`n znB3#=qNkg@D;ws#BkC4!Gc(lLE<_gSI3ENa+V}JzB8WoLWha4$0QVV4))-QZAbJ@K z5`aVtTV>)4%D_Nwdy5aSkQAXJ>TJ4oP)ki}-pxxi!O*eZ&kqumVbREjCgD|r7IP;? zs0Hm{)PLG19dI{m@WF&boy;mF8wJX{waHfC9$I>wj z@_k#zi0`7t?i&<+Lk6r;LW&xl7(*LNSBc|PRYB|eJM`toc?k0r#y?G+ZwhR8B7hoH zKo$Q(9V31z7IgQy!1vI1!4*a}R70iMU$C?aSdU?iA>kVN2ja2|<$;MkO1BoOwG%O1ALH6qJYwe38f+4>m{#m##uZLp_nAYVLt||AsJ;icy z8Vs+3XTCqX+GxMsw^v~mJsC}DOn|j|B~Er@IFmHu5Xkl>0cy?BXeKm+wpwh5*kjRu z-NQ^o@ujiUD^O`-7Z#O=1$h_2s-DSjQNVyN#8rl>lQQrPVF=8=8-eBK6jx9o=%1Hq=}5iK1P&Hd{J;oE z*+Wu|9rz@Xs(vI7YJ$sZUnZrK$I;gtWl1=pNJ~A_Tn>Fq3a~uJ? z6EBYkPac`z2eN;`Ps{oJ>v_z(WQd`*Cqelsc75|60KPYvESZe-J_k1MbB+;4gQY_I zzQI~EE>^z~{Ds}*dGX1k^8Y>VW3Hj!&#QNdz~`IqgPbNuQWwu^+({)UU^P7WNC;jh zGV|+MmfqiP;6YE%P-dtw27+tZa`M$)iOGfZUj&0i5`5yGkvC312xHL|o*=r3QQ{=d zW+J|`8K8zxK<#;paHT5H*o{bUD6t34FfvO1bZl2Yd5(e~@DSU#ns4-PcAAqUZ=YbP zll`S1J1IY!!~U45^$1jv5{#ZzgOMJn;gXWf0;dh8BU69DA`w+|!8op$j=KyfJKf;X zSKdM6u%;<)z;NUfT`eA(3lhwtOY(`b`-|7KF%*pe&&A#TzK%!#>`dlg9PZS8%>T+^ z#)kmF=7s4O1xFe-^rl{nJ>yZf{r&ZFq7?IUZp;*5Bjsb6*$gfVU6uiOjJXnnau$&@ zaY>0BdlP{vl%zC#Bze|;UMy07;Ul0)qmIfC;lwJ?L^8xH9+3hSzeC>QBBPfD2t$^1 z!GBwVu5NBN7gyO3_f3MhZ_>32*4pn7N;o>iP+y=d8qsa2)y`><$&UR=4jPu0QhzkR z1lOq$(yfl7Negw;(G;1p;##TlTHM!dv+ATE1b~hZ0M^;H$Z3B({dj#_BG%Hc`=D{; ze&JwrV25xLkBJ&`kT~Fu{R%kN`@CoflxF%M@(!=2Y_mcdh6{4)+>T`+6vRTPF>L}S zXGc=t%CiI44#P$D#W(Q=_tPH-kL%V?AJYsJkn4$F=uNHXa+pZg(O|4}7q5o+V)CIw zm4_ya-8dx>*?&vKojzVlbo(KuZsg~IE#*#=n4`at?x?wQZ%k&NV_y_Md{Pf3D%(Cm z;(@%c3S2U8Kn82^R5b!aHgUH!^lf{TI9iK*fRTa+i19F3V4-a<>wO5>7ajO+B{YE~ zNT6#KXB9Yhfu!0cnK|vwlt}{b>jfRdKGNpYym9mZC?nN{v1%bbJw3H-mt^J`wmBf! zLwi8NBX2?+MD|^6@@V#bT=8oHO>e4aD28hr$G2f9diU5Nke1k^aC+!FAcyuDNn`PBIQM;R_T2-IYrCo%o9FS7uI zGNDkuJ=(!JJIg@>3g&=n9E!mv&zsZ=YvqJT2tv3E+D0d($cB7Ot8*E-^4s0Cc13Xu zSk6fNO*4yR<-#vSQw5d;mXS*a@Vnu10h=9Q@!WOh$KK$z|0;U8PlCSU*4?%ZAS@yB zzkNkuO8C=`a+%e0~TDp$byYZ(>IEFY80;^$Xs{w}w6Q{?EuO)C*xi<%eA)tB)fHd}u73k9BW>vOBx6VOCE^iGjX}>gr zape9T)^wmk>suKA-IYlhDWe)!Z?)q<_DpJ+)b=$u8=;HBPI-sL@;f#cs!+W6R``Pp zZA&0jizWeeGflWfQDM`jC;0i;d6m02v3gAd;WK2AV`~k@mYonaud%{t7fZ^?&8k}O z=BE@$TB^YN$6ESq)~m*PV*?)LpA(AW%mC>UABU5WEP<%GZ{YV6dC&=UW4n%na1y5n zk53g4`hOAxQNJO;t0_iNptC8?LGvx_^C(7BpkW1WAAcZS3#L!d;p`#0jcVtdOR??w z$URSAApY^a?1^Bxp@pHryL9AsuV51igq>=_$DpA5SF3@ClNj4r3XTb4$6+2M5iJ%u zU*XJtXQ1pQ7*2LGUYhz70$KH+pk;mh<^GXOQ*qMrS(2Sq#a5aU#uq;vfyg#%m~G3&wI0~CdJcN7$qv+&vftiY(K2<5N{(4Gp4f;B>+ zyc!te_yLm>P_1>~+j;59KYS2ZXWScuMVe}mY+Hq{)g>qiBRJpzFa83>2`i+M<~v`0 zqX0P0z(_wSLkb+;@^JyIM-ev$yW1A-X>0=MyC$nM(Nk8YLd!dtq<<5}PU~&hTSQ>PR zq>_?oxh0ov%y#O_V^AyqTe&Xi$xmRKWBs0GEov64J;&n`L_XCl{6^Jnj^UZ4r>VHx zP@cw!4(d7Ld>l#f`I)g^nwnZTN|o2aD?i^es?KZ5E4&4|zqKa}?U`@)=5%UXAKU;_ z&?DByJ!_5Sm|FK4i<^LQmtt@{5!2?z*EFnRz1doTu^kVtUQ5af$ zp(ufTV}NzH2ft}BwiKHSMoS2ri6V^y3j$Z<2vtX$oCy>xSt8cKeyf&KKrp&52KD(M zvZHd;ZEu3ydVWN8Vb}F_n39r~-uz*~4g2)x>-8^l_+0bEM9Y!hb!B!g|KY|Vd$b!F zs!hRA!3a=6#&RVjKCfX$yZRBa1xC(_zC^)@prThhU9o9t-|Z6Ds%k$0OWHu$NO0`a zkC9fhM#B=Ey}i_1AJFwg3a}RX3n(O_Nd?|^$()@uIo>*VUuN@){{<4qF(GyfZ8>H& zS)VLI%OTqo9PF>Jlh1sADgEZ8Id1h!ppdN%hhX!f(k^nH{!9O*WdjJ$5FhQW~j^%H1}jhlZOTG1`3awn7q6y@msjmlSR zaYgzg45+5<_(KR;h%lh)*mgmsX?Q%oHPQcVUO#2#_VoQQrXI320|QEOLJtoSd0Z!A zws-S&@O3=G5J)1f3yLt)hZ&)A2SabthW$#q*=1#{4;sw_$2eK9hMk!guNeB>nr@JP z*Y{cB*Xsw_@>0jqzd^g)9@70I?_^7iPEte};Y!KNwC09!5DtK2+8f_aTI+GSA#4o5 zbUO1j?d*4%u*^#6j|9o-DnK6nSM5s%`@;rMFOkJaA(6Y1E)7PXHRhH;PZ%|qoOZKK81GV1_c9L2)S#D zlPsBxSI>koUj3_G0`{m$Cy%N65sA3aC|bWnnC>#aC~euD|IO=R@b6qkAhvB_Dc=NVBQe84klyHXOK%!zWL2kK~>&R@;*fp?jjh0(M0 zXNdbawwBMLj`_$qA=|yj$^Nt=_IuhQPmEyHB7QqWRO{_nt9Smmjtj9L+PSrH z7&^VB!OCXY_r@&ivkoa@E5W&yM^ufseaku>&H3x0zIc*2K%F_Dn8gDs!k#0FB&|## zPf-PcYXXk;zx780V$o1c7J{IcHL>ZF<)=N4MXsf#@!dEV-e%)#pPNix+G@!I+gp!3 zG(iaHwf^Eqw`0~VX?CYhmIjC0GgZ1NnG!M)AW%nbIHkYM^DsiF5K@E)9D{nVZ<;DS zYk*6JU}e|Brvk}-BL8>bQt1rhBjus{)niAzM-1Qn>iLHzhJ;<77G8A!1cRuaAEh)< zzK`=ce`PI zB$Wvwl(h-DFmu#cf_tWIyW zq*MtqM}O zGCyg5?Xr`JAZteKPCh(Wu5m%hWg1XcKA#&+9?Ec*PB28Eo@aQF-P%s~5I9&PIxdj? zsp9QyN~x4cAy~RZu(&|H-jGBkh@&PmPW3WI($MpCqgn6Xi@au02;`rb9a_ye-Zwfu z(ew4qCj?WSfa`r!njt*~)~oXP3iZ*PYATq|EBB}o#&GZ&0Qb+GOb6j$^fGX4<%+|q z>xtaTK{uw{nO(v9l=%4AC5>v>L$#f?t+wFSunDDim5=hsb#)?32-AD{>hfYG0e2*n zg4WPyU9Q9WQ`UZDlnV>$qh)E2tR2pLG^fu3#eX9NVT4p%o?KjagdOf9;qxAkY#lyh zwz|CgOh;w@DHdCk^ol&0ls5`e^7ug&!cns;NA)a#E7JE}!wJ)yjmK|&G2qCr1UsEc ztek@htUDWtha7#V2v!VG4^BSpl8XK)ZyS6PTo@hq%<&N65o(z)BZP(A=jU}r(`giU2803b2 zXnDUuWA+7V{wc`cc-L;`a9Lhb z7i{F=Xh&=?M4K7nvjhlifqxHRl9HuF-ZGz;nmlM2KlR!@En%*i%o%0LW+fZI#nt_O zV0bYq4@C$yZy+{dK2u~HHLJ75gpp>o*=ev2&K1(TsURYkmBoxd(xuU%`!(E5LJ~b! zG!jn4o^DNxF>;G!wbtL$*>XMJnBIOtr99t;HHK~R?HA2s;lpYq?-QVF?ii9vh=t2# z+Kc>e!g~AZDTN8=Ory8`8Q>xYUQ!kKrkQqeJ6qgHWcv8cC-A4v*`ywc`Q4Un2}OYG zC%5Vz`Mq)j4skv$C>jJ`+cvI~i=};)j*Q@eT7W@Tvc#c2H3Cw!=@J_DyS7;cplNy! zp|1JULVl_JNU^!9mx__iMhFb}7;<%!DtWtDGMMKN-5r;pmU!&B85MbCR;5}gg<}gW z4Lf&ylaipu9_&8h6NKqb>p^2r2e29Q_QlAZvo7UCpEE|!mbPqdB=g#koZ3he_zNq% zOrZ{Mlos!FB?k8z2_U(m%EwJ?fk&*?OCiP*mS7LsUwoZ$f~vjvvbj8M3hkNgZitd zS30-BU&&8}#5cz>a(kA$nQVJL#ayf*W=mSP@K?T>M+S)##C0Ee{8|)NQM|Mh<)7#x z>Xz7L5%ugp-_vHMB9R_%MNRwqnOR_w`(5TDCxJf`H!2CwEf=hwFz12p4Z*wbxa&m4 z05x@oA%Cl1?E(dWA_-$xG=g4c4K*!EwDg%~OdUtv2tC%|kQ~axr8{5ptMigU%KZ9K zkZz}+r*EPJEn>VR4EJziY!7$cWY#E4@0)(0=Zk;IMm2A354BY=F!7@Z8IlE(bu`PH zgYWbS5g3JNwmS^{>8pgm`W6GXzX!b{|8bnW+Zo3Qm&N;r;WkE-{%)2(^pZbIiy9xl z<>BH3OM(<`c6yArMwTdexF84p5xSS?3ZFsQ)X&y_RP+u?ov{j&v9io0P^8F$K z9FciIM)bRBaf*DO)5*SQ!yP?Ih;*&zi|r^@gzUMgB)qwE1nq?H4^{BVWkXUOXsYm|J2bhb6m`zd+cshKE z)2Y^HE)spKuKbWK8C_AqxR$Na4K3Xj(yTNZr;hze;OYy1Bkia|PuBwnGAyeKry^T@5tR=S{g|paeVCr3 zv49O%t?aKjeQ2$RjLl&}Z?Ll!@`moOZPJ@ymMl}3V^c-UW98}JAiE+h0m~YKmgAje z534;9lDEM!@#1qch+f+|qr{!7Z>a>zNZ&na%fW%Y&!Isk?S2D6^qIsp*KNw^`O(tr z^D|d#2xD?CUloP;8wsHi|N-Ia)K6UwkTin8hBE-pGY3b*#5_M&Y8ZIYI z;d0W@)$z4-UC{UYLhhF@<`^%C^KcvxcSjjC3@9XZ=VC-#@lzoaF#og_Cm$GxFF z#_KAjp@?Mei}$^Go@iBKNUQsf%||M<7TdvaQh^sMQMX<;ha2sjux)vKCfzYsj&ASr zr&AAyh$XgO1A}tHF=VP?BOf7SWG_L>japV|MbD1J3NQM+OS2C6Xx9icNAzd<-@t-c zlhWui{SlQx`rBxgt1d%o5eVDD9mh|-OT?hUPS6qg_jB0vr>`NX)VH3#wGwnAq4!ZO zdj+vRHz$G%I9O-pB<4#q!O_nuI92_#1G_m}pok!qhYepxp6Zc=UvxCVRZQetL;(?m z#Hvd3k?!Y_m74fY`8At$kXplq-KPBA=3bDAd{#|HJS+54#bPx{JesF+@^#zVyF|0I zA1_%(UAQo6N=x<0#3-Y7uaM7&Bc7Zt&+Mdo`<}!x1b;~Wt9#qy;VRL%Y!uSpC+@j} z9GNVQ&I#>er_uYQb4V?qFA7w@{S`A4n4YZ9`yWSoefTdB1NcUugtK5t91^_d!3sD0OVEueTD8g66ow!-Fw2wPB5ci(Z5Q ze1zaL+S|_(cjP!FSrT}_&C-xvLxN2+SlbTIckPQqSNN;n754+2Zw!@Bk~>hvjm_4ygmoA7Xch zErc`zM(y(Tv)sR>I!Lb824s@-#W6!k`H4ehhSB9)oA{@<=B8cVpU^T_-w6P-(fy2@ z7Y7`hpA^+V|C`1J=oouyU4zblHH7^60+Ni8nI>T|v}&w!GB&f2oHDT?*GZ(V7I63Y zacLNkx^PLKze@l)#w_0DkOx++ z$THkE{i@D(-Rn*bh^!IYj0?ss^7sCOmcvgec*^Q$0I2gi#(cOPB}PMF0^qP*KOn9O zW_#qBcF<7)A4}* zhi~!CkHW6DshD4IlQY!c&yDa9r(m}C-~1>T6$4hqB`9MZINW6_(=HixWddu_@_!gWwNAlp zY1Yr%0s=etr4Q=cWpmIIo!WtLWZ{+{?zGkX1}6O`1zQ1S@7B>EJvt3C%?`ep;0Jj% zK;Igo8z^Gk@$&r8R7i!B^)jH_cWUf%A>-ExiA14LCaWWyDI&?8A>y}M{cP0*QZYAV zIL(3--3qpivD2zgail}xFJ7B3V$OLS;%2vbtEl!GhBq`YW!w#30`=Ae{9-5h4PqVI z&q;LleLrXTXLwz6lD{hfa=UQTyC(Np2f-w4EXHtgt|j#=bE=OvO@EYy06#myw`05R zO8d(eZZbZfzun9!*sQ)&y>^7(d=hr`}hTD;6E0l=dl`mhFBfIvWO*Q(c9bMG-3bH*&y+mpT9HYP_%WLT}5; z*fs69FK9zj7Dv&&X%TOC^2QZdy(nhIPItunzW&vH92{ko=v4gG~H@8jmSEabx9W3$9Lo6FY$obOVK;qcRP6Pgez63-UI zO!tkyj*Y6b+pb?NfFQtYV>(?Df0q#6j6{(5f%7{_8cW&_;ZN`l|8kJB_QdY&fSWc? zFJ}?SAN0n=#O(%Llj9A#Z*63YC-?h(uq1zWIxfA8Z}?94CLP{7xm*^nB;AY=1CH4O z`G3HdAZ55|FZQm~-uc$T`NUAFcKbOf*@6D7V_+@kM}@-;;+2M+f%~isgf@s5wnUC{ zcGCq*C5WN&9c~zM0o?D5zF{cZVepgCXf@(T;4iwneW@1HAb)1iX4o)-&~{l^tyP$V zj?uYGqcm+*@q1}4=-SsudP$1tUJHDpQ9IO93!+Kan$umnLPdT}%7DSh@_k+B!+TTo zhJCtf9}BI1@kS;&xerlp07_qw%gPsx%5V7+U5`_!-2ih0qgSxw;Y8#*#18W7c<;6djjBL6@Gb>HvixN-e)c&;Ab8cdD zY5u}qZsLBWH^#ZH#B!#FQW z$GVj+WUcL}_W{0=1JYwLQ;Kc6LGGOe z^*`aU5pfL>aOr|g1c7!s#1#zQz4>#B4xRny_$CN`ud^jcwnebv;w0z^$|T!k`E84g zIwYW_u7u6#N39=_*vqC{^h=L)fwq^JZw>ynvLL8s?YgSgAiz-p!G{5yRXYbhBsk4g z%dTdivE9!GQqk7Egci)UjK4?Lr% zAFleUuPR8JFjS_BU*Gf{#OX6tSFbE5Y?9!dIMK}gK-}bmQzCX)cjHrF?9x~AnP;*M zgO*J1e(mQgDWW6`{UfrlqqYOGEH^5j`+_PQOcG<&4k)6E3t-c`cyxT`&AuU88z$In ziko$(*Hl4?DULA*{p}2o!^=y#s2Ho)*%3ZWG8MEZCXesdnw+A5(Ln*~M~C+^JXhW^ zp_L0l;2JYkhPVq_c*T}SntJ)Y1P;_@SsJY$@ro4x|1AY|=+nt)iH_gG#yd znRG1w@yRhC3)e`=;O_+;P~spYB6yC5EN!xCjEJa%wNn5wAo#{W>?Mimh~ioUrw-3J z@!0$Ak_*rX4Kc$y`7X+0SPsvc+~D6z%8M|QG&5y>jVN(!)Qj(#*1rlvZlu$C!yza2 z1JhiwpH4)-FX)u4ibjnQp&n7mmC2Rw#ghsE;5_(j6pDT{K{2lT)Ny-n80WJ@(KO1u zUW!KMPhvAdHdRow9|nF`wghjFY%?)o0A35c`f{C#!H_EY3v2-^bLF594}TPqB=dTG z`(M)AzBnG6Ss_2%L66wc(UF+NSTT#TDkgS;wITJ-gKsRBplxWxcEi3SL_WfjL`Yc| z4M0^F+K|S?G-$hHgpzX`TUgd<&ev4kA%C?~n#M25`86Cs&5(&seA3{Qr@-`YxA%ub z9VA>OL~zS5MroY@k6vH+J|-JGilmWpy=80piKKdP(Gb0Z%0ci)cL6#dAl{=Hc0ytn9gL#hk}A>Q>IZZzD!F@68(U6vd77|IW>Ll%@z`{@N!B zZ+X}OZI39(khs4LV4ekpGAU!z@?}Avu(!Te{3T5n#ZG@oJv!|^j~C#YHSLxs++`&zIZnuHq1a)mglm0)})UlFFzH1WDNA|k!Bw2uT%h(QS zNBNXxE;FFOS$)#yaPbM}s7k<(k-qoBy)(2essktE!-D~CcrDhlB>~Sb*EJ_{33O2} zZT?o)r>}lTy~l<5zE_np*S;`w1DfDVA;)t@2iHEMl2ap_Y-*UnLl?6%PA>8*D=MvT zPA=@MFiyO7E4xd&D%+aMB!zXVsxp z2UIwjLT$;*N6;IXTX3bYdaF?kPN2bI_XVOtui7_>@wyCMbYuUkkLp~z$2dX>* zv`3*+Rbs^L)KGe^{a50){}p$AFUA_sl9_1*+SMn`pP;00&HNeOoJ~5Q-(8Kd)o7eQ zZ>jzyEv~3c`gN+N3N@2hl*Fie5|nwmuFbgcY4yhE{_h{Q4EPZ#d{ZIukR9^ioE!;-4#|my~U0NMhJzO++?)-m@J?~ALeyB%G=vF z)~RLrCUsspEj3vBD44KXZjAQOtFGUso3$^c3}%`)Gi&nJM^)}<=GH?z>mBnPUp2H8;lI(l0^Csl5?KxnT57nf^(dxTX zKjtP<^7IdaS}au4=TuJYi!mK^k7a&@Z6FhhbRXGyTu{KDP|c@EO(LF4fGP0r*CAON z1PYRa8Yf>yq*GC7`z%Y!Jn;AIDr&G1*`kl+{*=byjmU(d*w;bw42ke25D zl=YS!hUZ}o3lmyW_+{mK{fC^YZpyx4NGLC|F#btT>6ga=-yhgm5azgginslW+A~Q= z;wdP23Do(hksViBinBjw5}Z-N?aV%ARd92QS+mb$_NYo7;bkX9+8Zlr4!*J{}6`OkZ|-ktxL- zN#ii-y!+Q+?M-fdB#XE=N%Bd~zsdIdPw5`;($R5MiNrngEyW2dg$U)}LpL{rO#pp* z;j9z661mt$WAaFX5)!qaRFR+W>|-KGU}3*y+XS^*dqTK%Tw-4@HAIvPHoxlmd;j-# z?K591L>h)#OP#ft@Aay=GC>f)&*%N?rn8HqmH$|w5dV=muwp-Nvo@Hx+U^N^N5VQi z9*2hEypDPhHI`3aYCMmACri*(1-!+##P(7ec~04p>Eia(Uq-F7DK`!h)w zz1OA{=8&|}%CDuG%jde@4i&<3?qxlADBT{a?J}tS66mfF(s9cl_q}`;hJl!=@c9v)^V|PCGtL!Iws}`I@$C95meTpJ+;o zD=mozOhH>b7Fww36U4IlN{sl+gg0i&g2MW528V;uKN75U4&8Z0YK=aV;7X$*PDZzGU%9~(*5(_Qdd~?)f;G<#}6OG%^=hWPHe$MUHPMPIyBP~e}+w~6WFgCYdFoA@C iiFN<~AGZ>{!A%e`MPb;7F2vjJ0g7@evNh5W*#7}0IcwMe From d6dac789124fb29138bd9f1db569a831ab1f2cc8 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Mon, 8 Aug 2016 00:48:30 -0400 Subject: [PATCH 013/621] Added code generation function --- hourglass/server/main.js | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index b6042bb..21f6228 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -20,9 +20,9 @@ classes.schema = new SimpleSchema({ code: {type: String, optional: true}, privacy: {type: String}, category: {type: String}, - moderators: {type: [String]}, - banned: {type: [String]}, - blockEdit: {type: [String]}, + moderators: {type: [String], optional: true}, + banned: {type: [String], optional: true}, + blockEdit: {type: [String], optional: true}, admin: {type: String} }); @@ -37,15 +37,32 @@ work.schema = new SimpleSchema({ done: {type: [String], optional: true} }); -// Meteor.methods({ -// createClass: function(client) { -// if -// } +function allow(user, method) { + //Switch/case for different permissions per method/function +} -// }); +var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; Meteor.startup(() => { - Meteor.methods({ - - }) + Meteor.methods({ + 'genCode': function() { + var text = ""; + var same = true; + while(same) { + for(var i = 0; i < 6; i++) { + text += possible.charAt(Math.floor(Math.random() * 52)); + } + if(!classes.find( { code: { $eq: text } } ).limit(1)) { + same = false; + } + } + return text; + }, + 'createClass': function(input) { + if(allow(Meteor.userId(),"createClass")) { + classes.schema.validate(input); + classes.insert(input); + } + } + }) }); \ No newline at end of file From 7fed7b56a6c76b62d9a78b3b1aedfde786f6b9e0 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 05:39:20 -0400 Subject: [PATCH 014/621] fixed code generator --- hourglass/server/main.js | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 21f6228..2709b65 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -41,22 +41,15 @@ function allow(user, method) { //Switch/case for different permissions per method/function } -var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; +_uuid4 = function(cc) { + var rr = Math.random() * 16 | 0; + return (cc === 'x' ? rr : (rr & 0x3 | 0x8)).toString(16); +} Meteor.startup(() => { Meteor.methods({ 'genCode': function() { - var text = ""; - var same = true; - while(same) { - for(var i = 0; i < 6; i++) { - text += possible.charAt(Math.floor(Math.random() * 52)); - } - if(!classes.find( { code: { $eq: text } } ).limit(1)) { - same = false; - } - } - return text; + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, _uuid4); }, 'createClass': function(input) { if(allow(Meteor.userId(),"createClass")) { From 54fe1d56954450b34a1b697f6e9eac55dd34ed81 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 05:49:27 -0400 Subject: [PATCH 015/621] add ongoworks:security for later use --- hourglass/.meteor/packages | 1 + hourglass/.meteor/versions | 1 + 2 files changed, 2 insertions(+) diff --git a/hourglass/.meteor/packages b/hourglass/.meteor/packages index 8ccfe16..968667a 100644 --- a/hourglass/.meteor/packages +++ b/hourglass/.meteor/packages @@ -26,3 +26,4 @@ aldeed:simple-schema accounts-google accounts-ui iron:router +ongoworks:security diff --git a/hourglass/.meteor/versions b/hourglass/.meteor/versions index 40bf955..276c511 100644 --- a/hourglass/.meteor/versions +++ b/hourglass/.meteor/versions @@ -70,6 +70,7 @@ npm-mongo@1.5.45 oauth@1.1.11 oauth2@1.1.10 observe-sequence@1.0.12 +ongoworks:security@2.0.1 ordered-dict@1.0.8 promise@0.8.3 proyk:meteor-cookies@0.0.1 From f402293f71fe79312a4aaa846d1d29b0b19fd6ec Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 06:14:37 -0400 Subject: [PATCH 016/621] removed allow() function --- hourglass/server/main.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 2709b65..00041a8 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -37,10 +37,6 @@ work.schema = new SimpleSchema({ done: {type: [String], optional: true} }); -function allow(user, method) { - //Switch/case for different permissions per method/function -} - _uuid4 = function(cc) { var rr = Math.random() * 16 | 0; return (cc === 'x' ? rr : (rr & 0x3 | 0x8)).toString(16); @@ -52,7 +48,7 @@ Meteor.startup(() => { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, _uuid4); }, 'createClass': function(input) { - if(allow(Meteor.userId(),"createClass")) { + if(Meteor.user() != null && Meteor.classes.find({status:true, admin:Meteor.userId()}).length < 5){ classes.schema.validate(input); classes.insert(input); } From 68e9c5361e4071a566e4fd19f33f440b57ecc7b8 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 06:18:01 -0400 Subject: [PATCH 017/621] changed schema --- hourglass/server/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 00041a8..3461fb4 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -16,14 +16,14 @@ classes.schema = new SimpleSchema({ name: {type: String, label: "Class Name"}, hour: {type: String, optional: true}, teacher: {type: String, optional: true}, + admin: {type: String, optional: true}, status: {type: Boolean, defaultValue: false}, code: {type: String, optional: true}, privacy: {type: String}, category: {type: String}, moderators: {type: [String], optional: true}, banned: {type: [String], optional: true}, - blockEdit: {type: [String], optional: true}, - admin: {type: String} + blockEdit: {type: [String], optional: true} }); work.schema = new SimpleSchema({ From 43a4f52334d592379a50542a07011b75976ab992 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 06:33:15 -0400 Subject: [PATCH 018/621] add autocomplete package --- hourglass/.meteor/packages | 1 + hourglass/.meteor/versions | 3 +++ 2 files changed, 4 insertions(+) diff --git a/hourglass/.meteor/packages b/hourglass/.meteor/packages index 968667a..f208de6 100644 --- a/hourglass/.meteor/packages +++ b/hourglass/.meteor/packages @@ -27,3 +27,4 @@ accounts-google accounts-ui iron:router ongoworks:security +mizzao:autocomplete diff --git a/hourglass/.meteor/versions b/hourglass/.meteor/versions index 276c511..33affaa 100644 --- a/hourglass/.meteor/versions +++ b/hourglass/.meteor/versions @@ -19,6 +19,8 @@ caching-compiler@1.0.6 caching-html-compiler@1.0.6 callback-hook@1.0.9 check@1.2.3 +coffeescript@1.0.17 +dandv:caret-position@2.1.1 ddp@1.2.5 ddp-client@1.2.9 ddp-common@1.2.6 @@ -60,6 +62,7 @@ meteor-base@1.0.4 minifier-css@1.2.13 minifier-js@1.2.13 minimongo@1.0.17 +mizzao:autocomplete@0.5.1 mobile-experience@1.0.4 mobile-status-bar@1.0.12 modules@0.7.5 From 23675285d24c7ff1cb1ae9a7dccd4065433a9643 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 07:08:40 -0400 Subject: [PATCH 019/621] fixed collections bug --- hourglass/collections/main.js | 35 ++++++++++++++++++++++++++++++++++ hourglass/server/main.js | 36 ----------------------------------- 2 files changed, 35 insertions(+), 36 deletions(-) create mode 100644 hourglass/collections/main.js diff --git a/hourglass/collections/main.js b/hourglass/collections/main.js new file mode 100644 index 0000000..8a5b8ef --- /dev/null +++ b/hourglass/collections/main.js @@ -0,0 +1,35 @@ +schools = new Mongo.Collection("Schools"); +classes = new Mongo.Collection("Classes"); +work = new Mongo.Collection("Work"); + +schools.schema = new SimpleSchema({ + name: {type: String}, + aliases: {type: [String]} +}); + +classes.schema = new SimpleSchema({ + school: {type: String}, + //icon: {type: String}, + name: {type: String, label: "Class Name"}, + hour: {type: String, optional: true}, + teacher: {type: String, optional: true}, + admin: {type: String, optional: true}, + status: {type: Boolean, defaultValue: false}, + code: {type: String, optional: true}, + privacy: {type: String}, + category: {type: String}, + moderators: {type: [String], optional: true}, + banned: {type: [String], optional: true}, + blockEdit: {type: [String], optional: true} +}); + +work.schema = new SimpleSchema({ + class: {type: String}, + dueDate: {type: Date}, + aliases: {type: [String]}, + submittor: {type: String}, + confirmations: {type: [String]}, + reports: {type: [String], optional: true}, + attachments: {type: [String], optional: true}, + done: {type: [String], optional: true} +}); \ No newline at end of file diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 3461fb4..f3c2291 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -1,42 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { Mongo } from 'meteor/mongo'; -schools = new Mongo.Collection("Schools"); -classes = new Mongo.Collection("Classes"); -work = new Mongo.Collection("Work"); - -schools.schema = new SimpleSchema({ - name: {type: String}, - aliases: {type: [String]} -}); - -classes.schema = new SimpleSchema({ - school: {type: String}, - //icon: {type: String}, - name: {type: String, label: "Class Name"}, - hour: {type: String, optional: true}, - teacher: {type: String, optional: true}, - admin: {type: String, optional: true}, - status: {type: Boolean, defaultValue: false}, - code: {type: String, optional: true}, - privacy: {type: String}, - category: {type: String}, - moderators: {type: [String], optional: true}, - banned: {type: [String], optional: true}, - blockEdit: {type: [String], optional: true} -}); - -work.schema = new SimpleSchema({ - class: {type: String}, - dueDate: {type: Date}, - aliases: {type: [String]}, - submittor: {type: String}, - confirmations: {type: [String]}, - reports: {type: [String], optional: true}, - attachments: {type: [String], optional: true}, - done: {type: [String], optional: true} -}); - _uuid4 = function(cc) { var rr = Math.random() * 16 | 0; return (cc === 'x' ? rr : (rr & 0x3 | 0x8)).toString(16); From 58c808b9ffc7002b4cb01e9cc392a73f50ff7491 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 19:05:21 -0400 Subject: [PATCH 020/621] added description to readme --- hourglass/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/hourglass/README.md b/hourglass/README.md index 3a90fb4..ae28445 100644 --- a/hourglass/README.md +++ b/hourglass/README.md @@ -1 +1,2 @@ # Hourglass +All your work in one place. Finish before your time runs out. \ No newline at end of file From 34ecc443eb2616f8793f1c1805579e6b0cd5a255 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Mon, 8 Aug 2016 19:55:46 -0400 Subject: [PATCH 021/621] New logo and respective backgrounds --- hourglass/public/favicon.ico | Bin 5430 -> 25334 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/hourglass/public/favicon.ico b/hourglass/public/favicon.ico index 088b81411b53b5c36d690dec23f42f1de5a9ca52..ee847fc04d0fe67089e069c766c150d9616eaace 100644 GIT binary patch literal 25334 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 QiMc;|{_(rnzb`rde>~~5VgLXD literal 5430 zcmd5jqeE_3eY}IXRYZGczkd}fKvAdMkTBN1j zUUsRN)RZnR$JUcX;c#AV$-sbAI9-c9FuVjo4CRp$B^*id>PCI|0YD- z;oS@_b~3nR!38gauR9cDj@I0YFFS^fbwR%d-|k}w4&y$}7^Asc@ky8FX`Rrad_+GH zH=b`>dIku|@Z&XP$7zE<7jNQ<%X%Nla!Df{e0p|-Wc_J=NPOKG?{xi9V2N3i>n$MLe-z4VmOxE9Sx8Fhfbx*P>PdS^~ znE3XJt2FprNt3RJCOZKRRBbBsa!uIJgr zWgn0Fn*V>=158X{q?{-ZdLE-)DzrYs&Zp{4S&#-{=hNlT-?Y})cWCbs|DZ{1i#&pU z6+UVxg6(A`Hw75gMH9D1Z+mS@+$L9cN&HLO#yf^p4-s?M>N` zrd`{5NOtstOna|^5sU(~A0G#%ZR*Q}e>4Y2+mA6%;cZ4mZ}~1$-ol^hRb4j65zBp> z-ZuRmQ1#N5O!|u)6uo(rzJusKPWo_ z_{|OAz1Mx1O@EPtP3!){?r8rd+up+e!TXB7C~&SD_^6ffh zUpeMxVc|`Y_Tq!v+03JbT6HFKAnoprd~DYKAMp?RIkZ2^&t}S>bZd%v&rl2AZ?yhk zW*tI(#3#ErY*?f2&O{ER`DP9O$*gx&qy9M2xE^bwb#S562@^&w!odFm|32ORq}NcP z9zDBvDID5S0Xr&M;IY;3Vjc1sthnb>D1P_=xGP_UqxGeDCe-027k?{VIgk#a)>Uz1 zv&)Nh&H&aqr)NXQKA!7VIQy|4YK5A|ON|;R9XXJOqI-syuRIZs`Wk+b94zO_e0>P> z7=pW<$I?;*k~dRbjk5N3^vo*GuCZu(=Amy40mxT-Z`%1I+fsQ3#I>o-lj6QepV}hE z#sfHJ#pjTxokXtZVha8XO#hcdHg#`EMp&b0%W50W{S#V4Hohg4f`9bvK^m!m_Ur%a z6_%t%EAY?)2AXmJPTgkW>Oug*^+f>FOH9lZ0tkpPn!k3JxmIvVC!!f{%9-s20Dl1* CflZkJ From 9fe1043c448cbc410ff2a268185b72c6d210736d Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 20:09:36 -0400 Subject: [PATCH 022/621] optimization and blank functions --- hourglass/server/main.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index f3c2291..3961253 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -11,11 +11,14 @@ Meteor.startup(() => { 'genCode': function() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, _uuid4); }, - 'createClass': function(input) { - if(Meteor.user() != null && Meteor.classes.find({status:true, admin:Meteor.userId()}).length < 5){ - classes.schema.validate(input); - classes.insert(input); - } - } + 'createClass': function(input) { + if(Meteor.user() != null && Meteor.classes.find({status:true, admin:Meteor.userId()}).length < 5){ + classes.schema.validate(input); + classes.insert(input); + } + }, + 'editProfile': function(profile) { + // profile.name = this.user + } }) }); \ No newline at end of file From d797edfd030d04cbccf8e8c1f788edfd8f7d0059 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 20:39:15 -0400 Subject: [PATCH 023/621] editProfile function --- hourglass/server/main.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 3961253..b9d6cf5 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -6,10 +6,9 @@ _uuid4 = function(cc) { return (cc === 'x' ? rr : (rr & 0x3 | 0x8)).toString(16); } -Meteor.startup(() => { Meteor.methods({ 'genCode': function() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, _uuid4); + return 'xxxxxx'.replace(/[x]/g, _uuid4); }, 'createClass': function(input) { if(Meteor.user() != null && Meteor.classes.find({status:true, admin:Meteor.userId()}).length < 5){ @@ -17,8 +16,16 @@ Meteor.startup(() => { classes.insert(input); } }, - 'editProfile': function(profile) { - // profile.name = this.user + 'editProfile': function(change) { + current = Meteor.user().profile; + current.school = change[0]; + current.grade = change[1]; + if (schools.find({name:current.school}).fetch().length > 0 && Number.isInteger(current.grade) && + current.grade >= 9 && current.grade <= 12) { + Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}) + return 1; + } else { + return 0; + } } - }) -}); \ No newline at end of file + }); \ No newline at end of file From 4c416cdd1857562a33bb77b0948ca6f2f8fbc6aa Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 20:46:49 -0400 Subject: [PATCH 024/621] added joinClass function --- hourglass/server/main.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index b9d6cf5..aa6a5a7 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -22,7 +22,18 @@ _uuid4 = function(cc) { current.grade = change[1]; if (schools.find({name:current.school}).fetch().length > 0 && Number.isInteger(current.grade) && current.grade >= 9 && current.grade <= 12) { - Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}) + Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}); + return 1; + } else { + return 0; + } + }, + 'joinClass': function(change, pass) { + found = classes.find({name: change}).fetch(); + if (Meteor.user() != null && found.length > 0 && pass === found[0].code) { + current = Meteor.user().profile; + current.classes.append(change); + Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}); return 1; } else { return 0; From e51d35eba9cc41ec9a925ca66d553d456759bd1f Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 20:49:24 -0400 Subject: [PATCH 025/621] change schema --- hourglass/collections/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hourglass/collections/main.js b/hourglass/collections/main.js index 8a5b8ef..5ae871a 100644 --- a/hourglass/collections/main.js +++ b/hourglass/collections/main.js @@ -15,7 +15,7 @@ classes.schema = new SimpleSchema({ teacher: {type: String, optional: true}, admin: {type: String, optional: true}, status: {type: Boolean, defaultValue: false}, - code: {type: String, optional: true}, + code: {type: String, defaultValue: ""}, privacy: {type: String}, category: {type: String}, moderators: {type: [String], optional: true}, From cf7a586cf24f77be5327e69fa4a870ef2fe63d89 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 20:55:02 -0400 Subject: [PATCH 026/621] fix tabbing --- hourglass/server/main.js | 68 +++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index aa6a5a7..c70b351 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -6,37 +6,39 @@ _uuid4 = function(cc) { return (cc === 'x' ? rr : (rr & 0x3 | 0x8)).toString(16); } - Meteor.methods({ - 'genCode': function() { - return 'xxxxxx'.replace(/[x]/g, _uuid4); - }, - 'createClass': function(input) { - if(Meteor.user() != null && Meteor.classes.find({status:true, admin:Meteor.userId()}).length < 5){ - classes.schema.validate(input); - classes.insert(input); - } - }, - 'editProfile': function(change) { - current = Meteor.user().profile; - current.school = change[0]; - current.grade = change[1]; - if (schools.find({name:current.school}).fetch().length > 0 && Number.isInteger(current.grade) && - current.grade >= 9 && current.grade <= 12) { - Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}); - return 1; - } else { - return 0; - } - }, - 'joinClass': function(change, pass) { - found = classes.find({name: change}).fetch(); - if (Meteor.user() != null && found.length > 0 && pass === found[0].code) { - current = Meteor.user().profile; - current.classes.append(change); - Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}); - return 1; - } else { - return 0; - } +Meteor.methods({ + 'genCode': function() { + return 'xxxxxx'.replace(/[x]/g, _uuid4); + }, + //NOT COMPLETE V + 'createClass': function(input) { + if(Meteor.user() != null && Meteor.classes.find({status:true, admin:Meteor.userId()}).length < 5 && + schools.find({name:input.school}).fetch().length > 0){ + classes.schema.validate(input); + classes.insert(input); + } + }, + 'editProfile': function(change) { + current = Meteor.user().profile; + current.school = change[0]; + current.grade = change[1]; + if (schools.find({name:current.school}).fetch().length > 0 && Number.isInteger(current.grade) && + current.grade >= 9 && current.grade <= 12) { + Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}); + return 1; + } else { + return 0; } - }); \ No newline at end of file + }, + 'joinClass': function(change, pass) { + found = classes.find({name: change}).fetch(); + if (Meteor.user() != null && found.length > 0 && pass === found[0].code) { + current = Meteor.user().profile; + current.classes.append(change); + Meteor.users.update({_id: Meteor.userId()}, {$set: {profile: current}}); + return 1; + } else { + return 0; + } + } +}); \ No newline at end of file From 701c964083374de4bfad29ca33ac754c78077476 Mon Sep 17 00:00:00 2001 From: yamanq Date: Mon, 8 Aug 2016 21:05:25 -0400 Subject: [PATCH 027/621] createClass backbone --- hourglass/collections/main.js | 2 +- hourglass/server/main.js | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/hourglass/collections/main.js b/hourglass/collections/main.js index 5ae871a..000472c 100644 --- a/hourglass/collections/main.js +++ b/hourglass/collections/main.js @@ -16,7 +16,7 @@ classes.schema = new SimpleSchema({ admin: {type: String, optional: true}, status: {type: Boolean, defaultValue: false}, code: {type: String, defaultValue: ""}, - privacy: {type: String}, + privacy: {type: Boolean}, category: {type: String}, moderators: {type: [String], optional: true}, banned: {type: [String], optional: true}, diff --git a/hourglass/server/main.js b/hourglass/server/main.js index c70b351..107dbcf 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -10,13 +10,16 @@ Meteor.methods({ 'genCode': function() { return 'xxxxxx'.replace(/[x]/g, _uuid4); }, - //NOT COMPLETE V + //No Security 'createClass': function(input) { - if(Meteor.user() != null && Meteor.classes.find({status:true, admin:Meteor.userId()}).length < 5 && - schools.find({name:input.school}).fetch().length > 0){ - classes.schema.validate(input); + // if(Meteor.user() != null && classes.find({status:true, admin:Meteor.userId()}).length < 5 && + // schools.find({name:input.school}).fetch().length > 0){ + // classes.schema.validate(input); classes.insert(input); - } + // return 1; + // } else { + // return 0; + // } }, 'editProfile': function(change) { current = Meteor.user().profile; From c2b71d66746ea761fa7954b0d88f07dc3828ff34 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Tue, 9 Aug 2016 00:51:12 -0400 Subject: [PATCH 028/621] Added 404 page --- hourglass/public/HG.jpg | Bin 0 -> 39685 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 hourglass/public/HG.jpg diff --git a/hourglass/public/HG.jpg b/hourglass/public/HG.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3f2387362643272e6e615d3c676810b85848be0 GIT binary patch literal 39685 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 literal 0 HcmV?d00001 From 3e7d6fec7c96d0fd0a3f1241896e4372cd061b30 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Tue, 9 Aug 2016 01:33:14 -0400 Subject: [PATCH 029/621] Folder organization --- hourglass/client/login/login.css | 148 +++++++++++ hourglass/client/login/login.html | 23 ++ hourglass/client/main/main.css | 370 ++++++++++++++++++++++++++ hourglass/client/main/main.html | 99 +++++++ hourglass/client/main/main.js | 221 +++++++++++++++ hourglass/client/profile/profile.css | 0 hourglass/client/profile/profile.html | 3 + hourglass/client/profile/profile.js | 0 8 files changed, 864 insertions(+) create mode 100644 hourglass/client/login/login.css create mode 100644 hourglass/client/login/login.html create mode 100644 hourglass/client/main/main.css create mode 100644 hourglass/client/main/main.html create mode 100644 hourglass/client/main/main.js create mode 100644 hourglass/client/profile/profile.css create mode 100644 hourglass/client/profile/profile.html create mode 100644 hourglass/client/profile/profile.js diff --git a/hourglass/client/login/login.css b/hourglass/client/login/login.css new file mode 100644 index 0000000..b520a34 --- /dev/null +++ b/hourglass/client/login/login.css @@ -0,0 +1,148 @@ +#loginHeader { + font-weight: 600; + width: 100%; + margin: 0; + box-shadow: 2px 2px 5px 3px #666; + + background-color: #EBEBEB; + + display: inline-block; + position: relative; + z-index: 50; +} + +#logo { + padding: 0.5%; + padding-left: 1%; + float: left; + + -webkit-filter: drop-shadow(2px 2px 5px #333); + filter: drop-shadow(2px 2px 5px #333); +} + +#banner { + height: 100%; + position: relative; +} + +#loginTitle { + font-size: 255%; + padding: 1.4%; + padding-left: 1%; +} + +#loginMain { + width: 100%; + min-height: 100%; + position: absolute; + top: 11%; + + background-color: #E5E5E5; + background-image: url("banner100.jpg"); +} + +#circle { + position: fixed; + top: 50%; + left: 50%; + + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + + background-color: rgba(0,0,0,0.2); + + -webkit-filter: drop-shadow(2px 2px 5px #333); + filter: drop-shadow(2px 2px 5px #333); +} + +#loginContent { + position: fixed; + top: 50%; + left: 50%; +} + +.text { + text-align: center; + color: #FFF; + + -webkit-filter: drop-shadow(2px 2px 5px #444); + filter: drop-shadow(2px 2px 5px #444); +} + +h2.text { + font-size: 400%; + padding-bottom: 2%; + border-bottom: 1px solid #FEFEFE; +} + +p.text { + font-size: 150%; +} + +#loginButton { + font-size: 200%; + padding: 2%; + + -webkit-border-radius: 6; + -moz-border-radius: 6; + border-radius: 6px; + + position: relative; + + background-color: #005CE6; + + -webkit-transition: background-color 0.4s ease; + -moz-transition: background-color 0.4s ease; + -ms-transition: background-color 0.4s ease; + transition: background-color 0.4s ease; +} + +#loginButton:hover { + background-color: #0066FF; +} + +#loginButton:active { + background-color: #FF4D4D; + + -webkit-transition: background-color 0.1s ease; + -moz-transition: background-color 0.1s ease; + -ms-transition: background-color 0.1s ease; + transition: background-color 0.1s ease; +} + +#loginFooter { + width: 100%; + box-shadow: 2px 2px 5px 3px #666; + background-color: #EBEBEB; + position: absolute; + bottom: 0; +} + +.login-button { + display: none !important; +} + +#github { + font-size: 150%; + margin: 0; + padding: 1%; + + -webkit-filter: drop-shadow(2px 2px 5px #444); + filter: drop-shadow(2px 2px 5px #444); +} + +a { + color: #0099CC; + text-decoration: none; + + -webkit-transition: color 0.4s ease; + -moz-transition: color 0.4s ease; + -ms-transition: color 0.4s ease; + transition: color 0.4s ease +} + +a:hover { + color: #00BFFF; +} + diff --git a/hourglass/client/login/login.html b/hourglass/client/login/login.html new file mode 100644 index 0000000..90628cd --- /dev/null +++ b/hourglass/client/login/login.html @@ -0,0 +1,23 @@ + diff --git a/hourglass/client/main/main.css b/hourglass/client/main/main.css new file mode 100644 index 0000000..da60283 --- /dev/null +++ b/hourglass/client/main/main.css @@ -0,0 +1,370 @@ +/* CSS Code Styling +Tag { Always spaces between values + Font: + Height + Width + Margin: [top, right, bottom, left]; + Padding: [top, right, bottom, left]; + + Border + + Drop-shadow + + Display + Position + Float + Overflow + z-index + + Color related items + + Animation related items +}*/ + +@import url(https://fonts.googleapis.com/css?family=Raleway:200,400,600); + +html { + font-family: 'Raleway'; + font-weight: 200; + overflow: hidden; + + /*background-image: url("Hourglass.png"); + background-size: 1920px 1080px;*/ + + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +body { + margin: 0; +} + +header { + font-weight: 600; + width: 100%; + margin: 0; + box-shadow: 2px 2px 5px 3px #666; + + display: inline-block; + position: relative; + z-index: 50; +} + +h1,h2,h3,h4,h5 { + margin: 0; + + -webkit-filter: drop-shadow(2px 2px 5px #666); + filter: drop-shadow(2px 2px 5px #666); +} + +h1 { + padding: 0.4%; + float: left; +} + +h4 { + font-size: 130%; + font-weight: 200; + padding: 5%; + -webkit-filter: drop-shadow(2px 2px 5px #333); + filter: drop-shadow(2px 2px 5px #333); + + display: inline-block; + + -webkit-transition: color 0.5s ease; + -moz-transition: color 0.5s ease; + -ms-transition: color 0.5s ease; + transition: color 0.5s ease; +} + +#aboveBar { + display: inline; +} + +.fa-bars, .fa-cog { + font-size: 200%; + height: 100%; + padding: 0.6%; + padding-right: 0.8%; + + float: left; + color: #333; + + -webkit-transition: color 0.5s ease, background-color 0.5s ease; + -moz-transition: color 0.5s ease, background-color 0.5s ease; + -ms-transition: color 0.5s ease, background-color 0.5s ease; + transition: color 0.5s ease, background-color 0.5s ease; + + cursor: pointer; +} +.fa-cog { + padding-left: 0.8%; + float: right; +} + +.fa-bars:hover, .fa-cog:hover { + background-color: #CCC; +} + +#loadBar, #progress { + width: 100%; + height: 4px; + display: table; + background-color: #33ADFF; +} + +#menuContainer, #optionsContainer { + min-height: 100%; + max-height: 100%; + width: 15%; + padding: 1% 0 1% 0; + box-shadow: 2px 2px 5px 3px #666; + + position: absolute; + z-index:0; + overflow-x: hidden; + overflow-y: auto; + + -webkit-transition: margin 0.5s ease, background-color 0.5s ease; + -moz-transition: margin 0.5s ease, background-color 0.5s ease; + -ms-transition: margin 0.5s ease, background-color 0.5s ease; + transition: margin 0.5s ease, background-color 0.5s ease; +} + +#optionsContainer { + width: 12%; + right: 0; +} + +.mode, .function { + width: 100%; + position: relative; + background-color: #849CAE; + + -webkit-transition: background-color 0.5s ease; + -moz-transition: background-color 0.5s ease; + -ms-transition: background-color 0.5s ease; + transition: background-color 0.5s ease; + + cursor: pointer; +} + +.mode:hover, .function:hover { + background-color: #A2B5C3; +} + +.mode:active, .function:active { + background-color: #EFF3F5; + + -webkit-transition: background-color 0.2s ease; + -moz-transition: background-color 0.2s ease; + -ms-transition: background-color 0.2s ease; + transition: background-color 0.2s ease; +} + +.fa-university, .fa-calendar { + font-size: 175%; + width: 12%; + padding: 10%; + -webkit-filter: drop-shadow(2px 2px 5px #666); + filter: drop-shadow(2px 2px 5px #666); +} + +.fa-plus, .fa-minus, .fa-tasks, .fa-graduation-cap { + font-size: 130%; + padding: 5%; + -webkit-filter: drop-shadow(2px 2px 5px #666); + filter: drop-shadow(2px 2px 5px #666); +} + +#functions { + width: 100%; + margin-top: 7%; + + border-style: solid; + border-color: #D9D9D9; + border-left: none; + + box-shadow: 0px 4px 8px 1px #222; + + position: relative; + z-index: 1; +} + +#functionHolder { + max-height: 48%; + width: 90%; + margin-bottom: 30%; + padding: 8%; + + display: none; + position: absolute; + overflow-y: auto; + opacity: 0; + + -webkit-transition: opacity 0.4s ease; + -moz-transition: opacity 0.4s ease; + -ms-transition: opacity 0.4s ease; + transition: opacity 0.4s ease; +} + +#create { + font-size: 140%; + width: 100%; +} + +.input { + margin: 0; + margin-top: 3%; + margin-bottom: -9%; + + -webkit-filter: drop-shadow(2px 2px 5px #666); + filter: drop-shadow(2px 2px 5px #666); +} + +.creSubmit { + width: 100%; + margin-top: 50%; + padding: 3% 0 3% 0; + text-align: center; + background-color: #849CAE; + + -webkit-transition: background-color 0.5s ease; + -moz-transition: background-color 0.5s ease; + -ms-transition: background-color 0.5s ease; + transition: background-color 0.5s ease; + + cursor: pointer; +} + +.creSubmit:hover { + background-color: #A2B5C3; +} + +.creSubmit:active { + background-color: #EFF3F5; + + -webkit-transition: background-color 0.2s ease; + -moz-transition: background-color 0.2s ease; + -ms-transition: background-color 0.2s ease; + transition: background-color 0.2s ease; +} + +input, select { + font-family: 'Raleway'; + width: 90%; + margin-bottom: 4%; + padding: 3.5%; + + position: relative; + z-index: 0; +} + +select { + font-family: 'Raleway'; + width: 100%; +} + +.creOptions { + width: 80%; + margin-top: -3.4%; + + box-shadow: 2px 2px 5px 3px #666; + + display: none; + position: absolute; + z-index: 5; + opacity: 0; + + -webkit-transition: opacity 0.4s ease; + -moz-transition: opacity 0.4s ease; + -ms-transition: opacity 0.4s ease; + transition: opacity 0.4s ease; +} + +.creOptions p { + margin: 0; + padding: 5%; + display: block; +} + +.creOptions p:hover { + box-shadow: inset 0 0 0 99999px rgba(0,0,0,0.1) +} + +.overlay { + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.5); + + display: none; + position: absolute; + top: 0; + left: 0; + z-index: 51; + + opacity: 0; + + -webkit-transition: opacity 0.4s ease; + -moz-transition: opacity 0.4s ease; + -ms-transition: opacity 0.4s ease; + transition: opacity 0.4s ease; +} + +.overlayCont { + font-size: 150%; + box-shadow: 2px 2px 5px 3px #666; + + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + + position: absolute; + top: 50%; + left: 50%; + + text-align: center; +} + +.fa-check-circle-o, .fa-times-circle-o { + font-size: 300%; + padding: 5% 13% 5% 13%; + + color: #333; + + -webkit-transition: color 0.4s ease; + -moz-transition: color 0.4s ease; + -ms-transition: color 0.4s ease; + transition: color 0.4s ease; + + cursor: pointer; +} + +.fa-check-circle-o:hover { + color: #85E085; +} + +.fa-check-circle-o:active { + color: #33CC33; + + -webkit-transition: background-color 0.2s ease; + -moz-transition: background-color 0.2s ease; + -ms-transition: background-color 0.2s ease; + transition: background-color 0.2s ease; +} + +.fa-times-circle-o:hover { + color: #FF6666; +} + +.fa-times-circle-o:active { + color: #ff1A1A; + + -webkit-transition: background-color 0.2s ease; + -moz-transition: background-color 0.2s ease; + -ms-transition: background-color 0.2s ease; + transition: background-color 0.2s ease; +} \ No newline at end of file diff --git a/hourglass/client/main/main.html b/hourglass/client/main/main.html new file mode 100644 index 0000000..089513a --- /dev/null +++ b/hourglass/client/main/main.html @@ -0,0 +1,99 @@ + + Hourglass + + + + + + + + + + \ No newline at end of file diff --git a/hourglass/client/main/main.js b/hourglass/client/main/main.js new file mode 100644 index 0000000..a82b7f9 --- /dev/null +++ b/hourglass/client/main/main.js @@ -0,0 +1,221 @@ +import { Template } from 'meteor/templating'; +import { ReactiveVar } from 'meteor/reactive-var'; + +import './main.html'; + +var openValues = { + "menu": "-25%", + "options": "-20%" +}; + +var themeColors = { + "light": { + "header":"#EBEBEB", + "sidebar":"#65839A", + "statusIcons":"#33ADFF", + "highlightText":"#FF1A1A" + }, + "dark": { + + } +}; + +var options = { + "school": [], + "privacy": ["Public", "Hidden"], + "category": ["Class", "Club", "Other"] +} + +var searchSchools = []; + +Session.set("menuOpen", false); +Session.set("optionsOpen", false); +Session.set("mode",null); // Change to user preferences +Session.set("function", null); +Session.set("confirm",null); +Session.set("formCre",null); + +Cookie.set("theme","light",{'years':15}); + +Template.main.helpers({ + divColor(div) { + return themeColors[Cookie.get("theme")][div]; + }, + iconColor(icon) { + let status = Session.get(icon+"Open"); + if(status) { + return themeColors[Cookie.get("theme")].statusIcons; + } else { + return; + } + }, + menuStatus() { + let status = Session.get("menuOpen"); + if(status) { + return "0%"; + } else { + return openValues["menu"]; + } + }, + modeStatus(status) { + if(status === Session.get("mode")) { + return themeColors[Cookie.get("theme")].highlightText; + } else { + return; + } + }, + functionStatus(status) { + if(status === Session.get("function")) { + return themeColors[Cookie.get("theme")].highlightText; + } else { + return; + } + }, + currFunction(name) { + if(name === Session.get("function")) { + return true; + } else { + return false; + } + }, + optionsStatus() { + let status = Session.get("optionsOpen"); + if(status) { + return "0%"; + } else { + return openValues["options"]; + } + }, + overlayDim(part) { + var dim = [window.innerWidth * .2,window.innerHeight * .2]; + var width = "width:"+dim[0].toString() + "px;"; + var height = "height:"+dim[1].toString() + "px;"; + var margin = "margin:"+(-dim[0]/2).toString() + "px 0 0 " + -(dim[1]/2).toString() + "px;"; + var bg = "background-color:"+themeColors[Cookie.get("theme")]["header"]+";"; + return width+height+margin+bg; + }, + creHighlight(input) { + if(input == Session.get("creInput")) { + return "#CCEEFF"; + } else { + return; + } + }, + schoolcomplete() { + return { + position: "bottom", + limit: 6, + rules: [ + { + token: '', + collection: schools, + field: 'name', + matchAll: true, + template: Template.schoollist + } + ] + }; + } +}); + +Template.main.events({ + 'click .fa-bars' () { + Session.set("menuOpen",!Session.get("menuOpen")); + }, + 'click .fa-cog' () { + Session.set("optionsOpen",!Session.get("optionsOpen")); + }, + 'click .classes' () { + Session.set("mode","classes"); + }, + 'click .calendar' () { + Session.set("mode","calendar"); + }, + 'click .addClass' () { + var functionHolder = document.getElementById("functionHolder") + closeDivFade(functionHolder); + setTimeout(function() { + Session.set("function","addClass"); + openDivFade(functionHolder); + },300); + }, + 'click .manageClass' () { + var functionHolder = document.getElementById("functionHolder") + closeDivFade(functionHolder); + setTimeout(function() { + Session.set("function","manClass"); + openDivFade(functionHolder); + },300); + }, + 'click .createClass' () { + var functionHolder = document.getElementById("functionHolder") + closeDivFade(functionHolder); + setTimeout(function() { + Session.set("function","creClass"); + openDivFade(functionHolder); + },300); + }, + 'click .creSubmit' () { + openDivFade(document.getElementsByClassName("overlay")[0]); + setTimeout(function() { + document.getElementsByClassName("overlay")[0].style.opacity = "1"; + }, 200); + Session.set("confirm","createClass"); + }, + 'click .fa-check-circle-o' () { + sendData(); + closeDivFade(document.getElementsByClassName("overlay")[0]); + closeDivFade(document.getElementById("functionHolder")); + document.getElementById("create").reset(); + setTimeout(function() { + Session.set("confirm",null); + Session.set("function",null); + }, 300); + }, + 'click .fa-times-circle-o' () { + closeDivFade(document.getElementsByClassName("overlay")[0]); + closeDivFade(document.getElementById("functionHolder")); + document.getElementById("create").reset(); + setTimeout(function() { + Session.set("confirm",null); + Session.set("function",null); + }, 300); + }, + 'click .creInput' (event) { + openDivFade(event.target.parentNode.childNodes[4]); + }, + 'click .creOptions p' (event) { + var p = event.target; + p.parentNode.parentNode.childNodes[1].value = p.childNodes[0].nodeValue; + closeDivFade(p.parentNode); + } +}); + +Template.schoollist.helpers({ + name() { + return this.name; + } +}); + +function openDivFade(div) { + div.style.display = "block"; + div.style.opacity = "0"; + setTimeout(function() { + div.style.opacity = "1"; + }, 100); +} + +function closeDivFade(div) { + div.style.opacity = "0"; + setTimeout(function() { + div.style.display = "none"; + }, 100); +} + +function sendData() { + // Take form data +} + +function select(div) { + div.parentNode.parentNode.childNodes[0].value = div.childNodes[0].nodeValue; +} \ No newline at end of file diff --git a/hourglass/client/profile/profile.css b/hourglass/client/profile/profile.css new file mode 100644 index 0000000..e69de29 diff --git a/hourglass/client/profile/profile.html b/hourglass/client/profile/profile.html new file mode 100644 index 0000000..f031f72 --- /dev/null +++ b/hourglass/client/profile/profile.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/hourglass/client/profile/profile.js b/hourglass/client/profile/profile.js new file mode 100644 index 0000000..e69de29 From 76e0701f714bb1acb756d8f22e277b01390bd739 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Tue, 9 Aug 2016 14:49:43 -0400 Subject: [PATCH 030/621] Minor display fixes, and removed useless code --- hourglass/client/main/main.html | 6 +++--- hourglass/client/main/main.js | 11 +++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/hourglass/client/main/main.html b/hourglass/client/main/main.html index 089513a..d48f25f 100644 --- a/hourglass/client/main/main.html +++ b/hourglass/client/main/main.html @@ -57,13 +57,13 @@ {{> inputAutocomplete settings=schoolcomplete class="form-control creInput" type="text" name="school" placeholder="Example: International Academy" }}

Hour:



-

Teacher

:
+

Teacher:



Class Name:



Privacy:


-
+

Public

Private

@@ -71,7 +71,7 @@

Category:


-
+

Class

Club

diff --git a/hourglass/client/main/main.js b/hourglass/client/main/main.js index a82b7f9..9f31e7b 100644 --- a/hourglass/client/main/main.js +++ b/hourglass/client/main/main.js @@ -1,5 +1,4 @@ import { Template } from 'meteor/templating'; -import { ReactiveVar } from 'meteor/reactive-var'; import './main.html'; @@ -21,7 +20,6 @@ var themeColors = { }; var options = { - "school": [], "privacy": ["Public", "Hidden"], "category": ["Class", "Club", "Other"] } @@ -34,6 +32,7 @@ Session.set("mode",null); // Change to user preferences Session.set("function", null); Session.set("confirm",null); Session.set("formCre",null); +Session.set("inputOpen",null); Cookie.set("theme","light",{'years':15}); @@ -182,12 +181,20 @@ Template.main.events({ }, 300); }, 'click .creInput' (event) { + var opened = Session.get("inputOpen"); + if(opened !== null && opened !== event.target.getAttribute("op")) { + closeDivFade(document.getElementsByClassName("creInputSel")[opened].parentNode.childNodes[4]); + } + }, + 'click .creInputSel' (event) { + Session.set("inputOpen", event.target.getAttribute("op")); openDivFade(event.target.parentNode.childNodes[4]); }, 'click .creOptions p' (event) { var p = event.target; p.parentNode.parentNode.childNodes[1].value = p.childNodes[0].nodeValue; closeDivFade(p.parentNode); + Session.set("inputOpen",null) } }); From 09346b1c6c5d355e4f8e42266bb54136b0fccd25 Mon Sep 17 00:00:00 2001 From: yamanq Date: Tue, 9 Aug 2016 16:56:09 -0400 Subject: [PATCH 031/621] added to schema --- hourglass/collections/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/hourglass/collections/main.js b/hourglass/collections/main.js index 000472c..57a4efd 100644 --- a/hourglass/collections/main.js +++ b/hourglass/collections/main.js @@ -21,6 +21,7 @@ classes.schema = new SimpleSchema({ moderators: {type: [String], optional: true}, banned: {type: [String], optional: true}, blockEdit: {type: [String], optional: true} + subscribers: {type: Number, optional: true} }); work.schema = new SimpleSchema({ From 51ab3c27ed1aa5b57c78b90604f60b5e19b2e965 Mon Sep 17 00:00:00 2001 From: yamanq Date: Tue, 9 Aug 2016 16:56:30 -0400 Subject: [PATCH 032/621] finished createClass function --- hourglass/server/main.js | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/hourglass/server/main.js b/hourglass/server/main.js index 107dbcf..c507ea9 100644 --- a/hourglass/server/main.js +++ b/hourglass/server/main.js @@ -12,14 +12,34 @@ Meteor.methods({ }, //No Security 'createClass': function(input) { - // if(Meteor.user() != null && classes.find({status:true, admin:Meteor.userId()}).length < 5 && - // schools.find({name:input.school}).fetch().length > 0){ - // classes.schema.validate(input); + var distinctEntries = _.uniq(classes.find({}, { + sort: {teacher: 1}, fields: {teacher: true} + }).fetch().map(function(x) { + return x.teacher; + }), true); + classes.schema.validate(input); + if(Meteor.user() != null && classes.find({status:false, admin:Meteor.userId()}).length < 5 && + schools.find({name:input.school}).fetch().length > 0 && input.status === true) { + + input.subscribers = 0; + input.admin = Meteor.userId() + if (input.privacy) { + input.code = genCode(); + } else { + input.code = ""; + } + if (input.category != "class" && input.category != "club") { + input.category = "other"; + } + input.moderators = [] + input.banned = [] + input.blockEdit = [] classes.insert(input); - // return 1; - // } else { - // return 0; - // } + joinClass(input.name, input.code) + return 1; + } else { + return 0; + } }, 'editProfile': function(change) { current = Meteor.user().profile; @@ -34,7 +54,7 @@ Meteor.methods({ } }, 'joinClass': function(change, pass) { - found = classes.find({name: change}).fetch(); + found = classes.find({name: change, status: true}).fetch(); if (Meteor.user() != null && found.length > 0 && pass === found[0].code) { current = Meteor.user().profile; current.classes.append(change); From 15bdca5b20577bf70ee03feeb5035319de94a6cd Mon Sep 17 00:00:00 2001 From: yamanq Date: Tue, 9 Aug 2016 16:57:45 -0400 Subject: [PATCH 033/621] typo --- hourglass/collections/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hourglass/collections/main.js b/hourglass/collections/main.js index 57a4efd..97f810f 100644 --- a/hourglass/collections/main.js +++ b/hourglass/collections/main.js @@ -20,7 +20,7 @@ classes.schema = new SimpleSchema({ category: {type: String}, moderators: {type: [String], optional: true}, banned: {type: [String], optional: true}, - blockEdit: {type: [String], optional: true} + blockEdit: {type: [String], optional: true}, subscribers: {type: Number, optional: true} }); From bed620cef2f13d9832b651ef378ad2172bfae387 Mon Sep 17 00:00:00 2001 From: Kenneth Jao Date: Tue, 9 Aug 2016 17:07:11 -0400 Subject: [PATCH 034/621] More page display fixes --- hourglass/client/login/login.html | 1 - hourglass/client/main/main.css | 7 +++++++ hourglass/client/main/main.html | 2 ++ hourglass/client/main/main.js | 21 ++++++++++++++++++--- hourglass/public/HG.jpg | Bin 39685 -> 28678 bytes 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/hourglass/client/login/login.html b/hourglass/client/login/login.html index 90628cd..0369fde 100644 --- a/hourglass/client/login/login.html +++ b/hourglass/client/login/login.html @@ -13,7 +13,6 @@

All your work in one place. Finish before your time runs out.

Sign in

-